1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<algorithm>
6 #include<cmath>
7 #include<queue>
8 using namespace std;
9 typedef long long ll;
10 const int maxn=1e2+3;
11 int n,m;
12 char s[maxn][maxn];
13 bool vis[maxn][maxn];
14 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
15 struct node
16 {
17 int x;
18 int y;
19 node(){}
20 node(int _x,int _y):x(_x),y(_y){}
21 };
22 void bfs(int x,int y,char ch)
23 {
24 queue<node> Q;
25 Q.push(node(x,y));
26 vis[x][y]=true;
27 while(!Q.empty())
28 {
29 node q=Q.front();
30 Q.pop();
31 for(int i=0;i<4;i++)
32 {
33 x=q.x+dir[i][0];
34 y=q.y+dir[i][1];
35 if(x>=0&&x<=n+1&&y>=0&&y<=m+1&&!vis[x][y]&&s[x][y]==ch)
36 {
37 vis[x][y]=true;
38 Q.push(node(x,y));
39 }
40 }
41 }
42
43 }
44 int main()
45 {
46 while(~scanf("%d%d",&n,&m))
47 {
48 memset(vis,false,sizeof(vis));
49 for(int i=1;i<=n;i++)
50 {
51 scanf("%s",s[i]+1);
52 }
53 for(int i=0;i<=n+1;i++)
54 {
55 s[i][0]=s[i][m+1]=‘0‘;
56 }
57 for(int i=0;i<=m+1;i++)
58 {
59 s[0][i]=s[n+1][i]=‘0‘;
60 }
61 int x0=0,x1=0;
62 for(int i=0;i<=n+1;i++)
63 {
64 for(int j=0;j<=m+1;j++)
65 {
66 if(!vis[i][j])
67 {
68 if(s[i][j]==‘1‘)
69 {
70 x1++;
71 bfs(i,j,‘1‘);
72 }
73 else
74 {
75 x0++;
76 bfs(i,j,‘0‘);
77 }
78 }
79 }
80 }
81 if(x0==2&&x1==1)
82 {
83 puts("0");
84 }
85 else if(x0==1&&x1==1)
86 {
87 puts("1");
88 }
89 else
90 {
91 puts("-1");
92 }
93 }
94 return 0;
95 }