#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1010;
int a[N][N];
bool t[N][N];
int n,m;
int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};
vector<int>x;
int dfs(int x,int y)
{
int sum=1;
t[x][y]= true;
for(int k=0;k<4;k++)
{
int i=x+dx[k],j=y+dy[k];
if(!t[i][j]&&(a[x][y]>>k&1)!=1&&i>0&&i<=n&&j>0&&j<=m)sum+=dfs(i,j)//,t[x][y]=true;
}
return sum;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!t[i][j])
x.push_back(dfs(i,j));
//t[i][j]=true;
}
}
sort(x.begin(),x.end());
reverse(x.begin(),x.end());
for(int i=0;i<x.size();i++)
{
cout<<x[i]<<" ";
}
return 0;
}
注意一下在递归前标记所走过的路径和&的优先级小于!=

京公网安备 11010502036488号