城堡

题目:

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

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

              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;
}
原文地址:https://www.cnblogs.com/CLGYPYJ/p/7238319.html