思想:
具体来说,这一代码存储房间难度颇大,但是用一个二维数组就可以解决。然后用正常bfs函数使用队列的思想去实现这一代码就足够AC了。
代码: 本代码使用了手写队列
#include<bits/stdc++.h>
using namespace std;
int a[10005][10005];
int px[4]={0,1,0,-1};
int py[4]={1,0,-1,0};
int wx[4]={0,2,0,-2};
int wy[4]={2,0,-2,0};
int bfs(int sx,int sy){
int q[5005][2],head=0,tail=0;
tail++;
q[tail][0]=sx;
q[tail][1]=sy;
int rooms=1;
while(head<tail){
head++;
int x=q[head][0];
int y=q[head][1];
for(int i=0;i<4;i++){
int mx=x+px[i];
int my=y+py[i];
int nx=x+wx[i];
int ny=y+wy[i];
if(a[mx][my]==0&&a[nx][ny]==2){
a[mx][my]=1;a[nx][ny]=3;
tail++;
q[tail][0]=nx;
q[tail][1]=ny;
rooms++;
}
}
}
return rooms;
}
int main(){
int m,n;
cin>>m>>n;
for(int i=2;i<=1+m*2;i+=2){
for(int j=2;j<=1+n*2;j+=2){
a[i][j]=2;
a[i-1][j-1]=1;
a[i-1][j+1]=1;
a[i+1][j-1]=1;
a[i+1][j+1]=1;
int p;cin>>p;
a[i][j-1]=p%2;p/=2;
a[i-1][j]=p%2;p/=2;
a[i][j+1]=p%2;p/=2;
a[i+1][j]=p%2;p/=2;
}
}
int maxRoom=0,rooms=0;
for(int i=2;i<=1+m*2;i+=2){
for(int j=2;j<=1+n*2;j+=2){
int newMax;
if(a[i][j]==2){
a[i][j]=3;
newMax=bfs(i,j);
rooms++;
if(newMax>maxRoom)
maxRoom=newMax;
}
}
}
cout<<rooms<<endl<<maxRoom;
return 0;
}