题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6113
题意:中文题
解析:其实题目对于两种条件,给的限制条件很多,只要仔细读题,还是很好写的,总的来说就是要么只有一个1的联通块给0包围,要么就是只有一个零的联通块给1包围,所以你只要在外面一圈0零,然后dfs,数一数1和0的联通块的数量即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
char a[maxn][maxn];
int vis[maxn][maxn];
int n,m;
int dx[] = {0,1,-1,0};
int dy[] = {1,0,0,-1};
void dfs(int x,int y,char type)
{
for(int i=0;i<4;i++)
{
int tx = x+dx[i];
int ty = y+dy[i];
if(tx<0||tx>n+1 || ty<0 || ty>m+1)
continue;
if(vis[tx][ty])
continue;
if(a[tx][ty]==type)
{
vis[tx][ty] = 1;
dfs(tx,ty,type);
}
}
}
int main(void)
{
while(~scanf("%d %d",&n,&m))
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%s",a[i]+1);
for(int i=0;i<=n+1;i++)
{
a[i][0] = '0';
a[i][m+1] = '0';
}
for(int i=0;i<=m+1;i++)
{
a[0][i] = '0';
a[n+1][i] = '0';
}
int cnt1 = 0,cnt2 = 0;
// for(int i=0;i<=n+1;i++)
// printf("%s\n",a[i]);
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=m+1;j++)
{
if(!vis[i][j])
{
if(a[i][j]=='0')
cnt1++;
if(a[i][j]=='1')
cnt2++;
vis[i][j] = 1;
dfs(i,j,a[i][j]);
}
}
}
if(cnt1==1 && cnt2==1)
puts("1");
else if(cnt1==2 && cnt2==1)
puts("0");
else
puts("-1");
}
return 0;
}