zoukankan      html  css  js  c++  java
  • 城堡

    题目:

      给出一张地图,每个位置的值意义如下:

        一个数字有以下四个数中的若干个构成:

                  1:西面有墙。

                  2:北面有墙。

                  4:东面有墙。

                  8:南面有墙。

      这个题我因为一个小错误考试只得了10分,后来又调了很久。。。

      终于,聪明的我发现我没有按题目要求做,把优先级搞错了(西面房间的优先级应该最高)

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #include<math.h>
    using namespace std;
    int m,n,t,c;
    int f[5000][6],color[5000],s[5000];
    void dfs(int  x,int     y)
    {
        color[x]=y;
        for(int i=1;i<=f[x][0];i++)
        {
            t=f[x][i];
            if(!color[t])
                dfs(t,y);
        }
        return ;
    }
    int main()
    {
        freopen("fortress.in","r",stdin);
        freopen("fortress.out","w",stdout);
        scanf("%d%d",&m,&n);    
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&c);
            if(c<8&&i!=n)    f[i*m+j][++f[i*m+j][0]]=i*m+j+m;else c-=8;
            if(c<4&&j!=m)    f[i*m+j][++f[i*m+j][0]]=i*m+j+1;else c-=4;
            if(c<2&&i!=1)    f[i*m+j][++f[i*m+j][0]]=i*m+j-m;else c-=2;
            if(c<1&&j!=1)    f[i*m+j][++f[i*m+j][0]]=i*m+j-1;
        }
        int sum=0,maxn1=0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)    
            if(!color[i*m+j])
                dfs(i*m+j,i*m+j),sum++;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            ++s[color[i*m+j]],maxn1=max(maxn1,s[color[i*m+j]]);
        printf("%d
    %d
    ",sum,maxn1);
        int maxn2=0,u,v;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            c=color[i*m+j],v=color[i*m+j+1],u=color[i*m+j+m];
            if(c!=v&&j!=m)    maxn2=max(maxn2,s[c]+s[v]);
            if(c!=u&& i!=n)    maxn2=max(maxn2,s[c]+s[u]);
        }
        printf("%d
    ",maxn2);
        for(int j=1;j<=m;j++)
        for(int i=n;i>=1;i--)
        {
            c=color[i*m+j],v=color[i*m+j+1],u=color[i*m+j-m];
            if(c!=u && s[c]+s[u]==maxn2)    
            {
                printf("%d %d N",i,j);
                return 0;
            }
            if(c!=v && s[c]+s[v]==maxn2)
            {
                printf("%d %d E",i,j);
                return 0;
            }
        }
        return 0;
    }
  • 相关阅读:
    Requests 库
    Mac下终端配置(item2 + oh-my-zsh + solarized配色方案)
    中文名文件上传到linux服务器上以后文件名会乱码(openoffice)
    scp
    请求https前缀的网站验证SSL证书的解决方案之一
    jupyter notebook更换主题 步骤详解。
    jupyter nbextensions的 安装
    装饰器的学习 高级版-- 语法糖参数
    装饰器的学习 初级版-- 高阶函数,嵌套函数,闭包
    Python数据可视化的完整版操作指南(建议收藏)
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7238319.html
Copyright © 2011-2022 走看看