城堡
题目:
给出一张地图,每个位置的值意义如下:
一个数字有以下四个数中的若干个构成:
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\n%d\n",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\n",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; }