The Castle

首先,这题大体上肯定是可以参考 细胞 的。

另外,

关于最大房间的求解,只要对每一个队列求一次房间数,取最大值即可!

由于每个房间的“墙”使用了二进制表示(实际上是对应二进制的十进制值),

这里我反其道而行之,将这个十进制值又转化为二进制(实际上也是对应二进制的十进制值(表示方法与前面不同))

然后用一点小技巧实现像上下左右的判断(详情可见代码(*^▽^*))

 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 }