中文题竟然都没静下心去看题,不得不说现在的我有点飘了,简单的dfs。。。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
bool vis[105][105];
int map1[105][105];
int dir[4][2]= {0,1,0,-1,1,0,-1,0};
int n,m,N;
void dfs(int x,int y,int tag)
{
N++;
vis[x][y]=1;
for(int i=0; i<4; i++)
{
int x1=dir[i][0]+x;
int y1=dir[i][1]+y;
if(x1>0&&x1<=n&&y1>0&&y1<=m&&vis[x1][y1]==0&&map1[x1][y1]==tag)
dfs(x1,y1,tag);
}
}
int main()
{
while(~scanf("%d%d%*c",&n,&m))
{
N=0;
memset(vis,0,sizeof(vis));
memset(map1,0,sizeof(map1));
int cnt=0;
char c;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
scanf("%c",&c);
map1[i][j]=c-'0';
if(map1[i][j]==0)cnt++;
}
getchar();
}
int cnt1=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(vis[i][j]==0&&map1[i][j]==1)
dfs(i,j,1),cnt1++;
}
if(cnt1!=1)
{
printf("-1\n");
continue;
}
N=0;
for(int i=1; i<=n; i++)
{
if(map1[i][1]==0&&vis[i][1]==0)dfs(i,1,0);
if(map1[i][m]==0&&vis[i][m]==0)dfs(i,m,0);
}
for(int i=1; i<=m; i++)
{
if(map1[1][i]==0&&vis[1][i]==0)dfs(1,i,0);
if(map1[n][i]==0&&vis[n][i]==0)dfs(n,i,0);
}
if(cnt-N==0)printf("1\n");
else
{
int cnt0=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(vis[i][j]==0&&map1[i][j]==0)
dfs(i,j,0),cnt0++;
}
if(cnt0==1)printf("0\n");
else printf("-1\n");
}
}
return 0;
}