爆搜吧 50的复杂度 只要不是上天的循环次数 都能过
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int a[N][N];
int vis[N][N];
int n,m;
int dfs(int x,int y)
{
int ans = 0;
vis[x][y] = 1;
if((a[x][y]>>0&1) == 0 && y - 1 > 0 && !vis[x][y-1]) ans += dfs(x,y-1);
if((a[x][y]>>1&1) == 0 && x - 1 > 0 && !vis[x-1][y]) ans += dfs(x-1,y);
if((a[x][y]>>2&1) == 0 && y + 1 <= m && !vis[x][y+1]) ans += dfs(x,y+1);
if((a[x][y]>>3&1) == 0 && x + 1 <= n && !vis[x+1][y]) ans += dfs(x+1,y);
return ans+1;
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d",&a[i][j]);
int res= 0,cnt = 0;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
if(!vis[i][j])
{
cnt++;
res = max(res,dfs(i,j));
}
printf("%d\n%d",cnt,res);
}