首先,这题大体上肯定是可以参考 细胞 的。
另外,
关于最大房间的求解,只要对每一个队列求一次房间数,取最大值即可!
由于每个房间的“墙”使用了二进制表示(实际上是对应二进制的十进制值),
这里我反其道而行之,将这个十进制值又转化为二进制(实际上也是对应二进制的十进制值(表示方法与前面不同))
然后用一点小技巧实现像上下左右的判断(详情可见代码(*^▽^*))
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 6 const int N=55; 7 int r,c,ans,room,a[N][N],b[N][N],t[]={1,0,-1,0,0,1,0,-1}; 8 queue<int> q; 9 int toBin(int v){ 10 int ans=0,t=16; 11 while(t/=2){ 12 ans=ans*10; 13 if(v>=t){ 14 ans+=1; 15 v-=t; 16 } 17 } 18 return ans; 19 } 20 void bfs(){ 21 if(q.empty()){ 22 ans++; 23 return; 24 } 25 int ni=q.front(); 26 q.pop(); 27 int nj=q.front(); 28 q.pop(); 29 int tm=a[ni][nj]; 30 for(int i=0,div=1000;i<4;i++,tm%=div,div/=10){ 31 ni+=t[i],nj+=t[i+4]; 32 if(!(tm/div)&&!b[ni][nj]){ 33 q.push(ni),q.push(nj); 34 b[ni][nj]=1; 35 } 36 ni-=t[i],nj-=t[i+4]; 37 } 38 room++; 39 bfs(); 40 } 41 int main(){ 42 int tmp,max_room=0; 43 cin>>r>>c; 44 for(int i=1;i<=r;i++) 45 for(int j=1;j<=c;j++){ 46 scanf("%d",&tmp); 47 a[i][j]=toBin(tmp); 48 } 49 for(int i=1;i<=r;i++) 50 for(int j=1;j<=c;j++) 51 if(!b[i][j]){ 52 room=0; 53 q.push(i),q.push(j); 54 b[i][j]=1; 55 bfs(); 56 max_room=max(max_room,room); 57 } 58 printf("%d\n%d",ans,max_room); 59 return 0; 60 }