1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | # # # # # #---#####---#####---#####---# 3 # | | # # # # # #---#########---#####---#---# 4 # # | | | | # # ############################# (图 1) # = Wall | = No wall - = No wall
图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~4面墙。
输入4 7 11 6 11 6 3 10 6 7 9 6 13 5 15 5 1 10 12 7 13 7 5 13 11 10 8 10 12 13
5 9
这道题最麻烦就是墙的处理;为了判断有没有墙,我设了一个3维数组。int b[60][60][4];其中数组代表每个坐标的墙的方向,0代表西墙,1代表北墙,2代表东墙,3代表南墙。
而判断有无墙我用了一个循环。
while(a>0) { if(a%2==1) {b[i][j][k]=1;a--;} k++; a/=2; }
然后就用广搜就行了。
全代码:
#include<cstdio> #include<stack> #include<cstring> #include<queue> using namespace std; int i=1,m,n,a,b[60][60][4],sum,maxn,minx; bool c[60][60]; int l[4]={-1,0,+1,0}, r[4]={0,+1,0,-1}, t[4]={1,2,3,0}; queue<int>f; queue<int>q; void count(int e,int o) { minx=1; c[e][o]=1; f.push(e); q.push(o); do{ for(int i=0;i<=3;i++) { if((f.front()+l[i]>0)&&(f.front()+l[i]<=m)&&(q.front()+r[i]>0)&&(q.front()+r[i]<=n)&&(b[f.front()][q.front()][t[i]]==0)&&(c[f.front()+l[i]][q.front()+r[i]]==0)) { f.push(f.front()+l[i]); q.push(q.front()+r[i]); c[f.back()][q.back()]=1; minx++; } } f.pop(); q.pop(); }while(!f.empty()); if(minx>maxn) maxn=minx; } int main() { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { scanf("%d",&a); int k=0; while(a>0) { if(a%2==1) {b[i][j][k]=1;a--;} k++; a/=2; } } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { if(c[i][j]==0){ count(i,j); sum++;} } printf("%d\n%d",sum,maxn); }