染色问题的想法,But 40 分。
#include <bits/stdc++.h>
using namespace std;
int n,m,sum;
char num[1050][1050];
void dfs(int x,int y)
{
if(x<=0||y<=0||x>n||y>m) return;
if(num[x+1][y]=='0'&&num[x-1][y]=='0'&&num[x][y+1]=='0'&&num[x][y-1]=='0') return;
if(y-1>0&&num[x][y-1]!='0')
{
num[x][y-1]='0';
y-=1;
dfs(x,y);
}
if(num[x+1][y]=='0'&&num[x-1][y]=='0'&&num[x][y+1]=='0'&&num[x][y-1]=='0') return;
if(y+1<=m&&num[x][y+1]!='0')
{
num[x][y+1]='0';
y+=1;
dfs(x,y);
}
if(num[x+1][y]=='0'&&num[x-1][y]=='0'&&num[x][y+1]=='0'&&num[x][y-1]=='0') return;
if(x-1>0&&num[x-1][y]!='0')
{
num[x-1][y]='0';
x-=1;
dfs(x,y);
}
if(num[x+1][y]=='0'&&num[x-1][y]=='0'&&num[x][y+1]=='0'&&num[x][y-1]=='0') return;
if(x+1<=n&&num[x+1][y]!='0')
{
num[x+1][y]='0';
x+=1;
dfs(x,y);
}
if(num[x+1][y]=='0'&&num[x-1][y]=='0'&&num[x][y+1]=='0'&&num[x][y-1]=='0') return;
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>num[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(num[i][j]!='0')
{
num[i][j]='0';
dfs(i,j);
sum++;
}
}
}
printf("%d",sum);
return 0;
}