#include #include #include #include #include #include #include #include #include #include #define maxdim 505 #define pb push_back #define mp make_pair using namespace std; int n,m; char A[maxdim][maxdim]; int viz[maxdim*maxdim],lowest[maxdim*maxdim],niv[maxdim*maxdim],sol[maxdim*maxdim]; vectorG[maxdim*maxdim]; stack< pair >St; int dx[] = {-1,0,1,0}; int dy[] = {0,1,0,-1}; inline int getCode ( int i , int j ){ return (i-1)*m + j; } inline void componenta ( int x , int y ){ int nod1,nod2; vectorv; do{ nod1 = St.top().first; nod2 = St.top().second; St.pop(); v.pb(nod1); v.pb(nod2); }while(nod1 != x || nod2 != y); sort(v.begin(),v.end()); vector::iterator itt = unique(v.begin(),v.end()); v.resize(itt-v.begin()); if ( (int)v.size() >= 4 ){ for ( int i = 0 ; i < (int)v.size() ; ++i ){ sol[v[i]] = 1; } } } void dfs ( int nod , int t ){ viz[nod] = 1; niv[nod] = lowest[nod] = niv[t] + 1; for ( vector::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){ int nodvcn = (*itt); if ( nodvcn == t ) continue ; if ( !viz[nodvcn] ){ St.push(mp(nod,nodvcn)); dfs(nodvcn,nod); if ( lowest[nodvcn] < lowest[nod] ) lowest[nod] = lowest[nodvcn]; if ( lowest[nodvcn] >= niv[nod] ){ componenta(nod,nodvcn); } } else{ if ( lowest[nod] > niv[nodvcn] ){ lowest[nod] = niv[nodvcn]; } } } } void biconex () { for ( int i = 1 ; i <= n*m ; ++i ){ if ( !viz[i] ){ dfs(i,0); } } } int main () { #ifndef ONLINE_JUDGE freopen("mindcoding3.in","r",stdin); freopen("mindcoding3.out","w",stdout); #endif scanf("%d %d\n",&n,&m); for ( int i = 1 ; i <= n ; ++i ){ scanf("%s",A[i]+1); } for ( int i = 1 ; i <= n ; ++i ){ for ( int j = 1 ; j <= m ; ++j ){ if ( A[i][j] == '0' ) continue ; for ( int d = 0 ; d < 4 ; ++d ){ int iv = i + dx[d],jv = j + dy[d]; if ( A[iv][jv] != '1' ) continue ; G[getCode(i,j)].push_back(getCode(iv,jv)); } } } biconex(); int s = 0; for ( int i = 1 ; i <= n*m ; ++i ){ s += sol[i]; } printf("%d\n",s); return 0; }