二刷提高课,题解目录在这里— 提高课的题解目录
虽然题目看起来有些复杂
但是由于题目特意将墙是否存在用二进制来判断所以我们直接判断即可
#include<iostream>
using namespace std;
const int N=1e2+10,M=N*N;
typedef pair<int ,int >PII;
bool st[N][N];
int g[N][N];
int n,m;
int res,sum;
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
PII q[M];
int bfs(int x,int y)
{
int hh=0,tt=0;
q[0]={x,y};
st[x][y]=true;
int cnt=1;
while(hh<=tt)
{
auto kk=q[hh++];
int a=kk.first,b=kk.second;
for(int i=0;i<=3;i++)
{
if(g[a][b]>>i&1)continue;
int x1=a+dx[i],y1=b+dy[i];
if(x1<0||x1>n||y1<0||y1>m)continue;
if(st[x1][y1])continue;
st[x1][y1]=true;
q[++tt]={x1,y1};
cnt++;
}
}
return cnt;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)cin>>g[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!st[i][j])
{
res++;
sum=max(sum,bfs(i,j));
}
cout<<res<<endl;
cout<<sum;
return 0;
}