题目链接
简单dfs题目,但是用到了二进制的分解,对2取余倒着排列
(42除以2得到的余数分别为010101,倒着排一下,42所对应二进制就是101010)
1代表有墙,0代表没有墙(注意方向数组的写法)
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
const int INF=0x3f3f3f3f;
int a[120][120];
bool vis[120][120];
int ans=-INF,sum=0;
int dx[]={0,-1,0,1};
int dy[]={-1,0,1,0};
int n,m;
void dfs(int x,int y){
sum++;
vis[x][y]=1;
ans=max(ans,sum);
for(int i=0;i<4;i++){
if((a[x][y]&1)==0){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&vis[nx][ny]==0){
dfs(nx,ny);
}
}
a[x][y]>>=1;
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
int cnt=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!vis[i][j]){
sum=0;
dfs(i,j);
cnt++;
}
}
}
cout<<cnt<<endl;
cout<<ans<<endl;
}