算法
(BFS) $O(nm)$
判断一个点是否能走向其他地方就是判断这个数字是否二进制表示下存在0,所以采用位运算进行判断。
借助大佬的图解,把dx[4],dy[4]设置好,然后进行bfs即可,用一个st[][]数组对每个点是否遍历进行判断即可。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N =55;
int g[N][N],m,n;
bool st[N][N];
int dx[4] = {0,-1,0,1}, dy[4] = {-1,0,1,0} ;
int bfs(int a,int b)
{
st[a][b]=true;
queue<PII> q;
q.push({a,b});
int co=0;
while(q.size())
{
auto t=q.front();
q.pop();
co++; //每走一个点表示房间的面积+1
int x=t.first,y=t.second;
for(int i=0;i<4;i++)
{
if(!(g[x][y]>>i&1)) //位运算思想,表示此处的点是0,可以走到其他地方
{
int xx=x+dx[i],yy=y+dy[i]; //表示可以走的那个点的坐标
if(xx>=0 && xx<n && yy>=0 && yy<m && !st[xx][yy])
{
st[xx][yy]=true;
q.push({xx,yy}); //把该点加入到队列中去。
}
}
}
}
return co;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
int total=0,maxr=-1;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!st[i][j])
{
total++;
maxr=max(maxr,bfs(i,j));
}
}
}
cout<<total<<endl;
cout<<maxr<<endl;
return 0;
}