//#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define endl '\n' #define X first #define Y second #define MAXN 1024 #define INF 1000010000 #define LLINF 1000000010000000000 #define ULLINF 10000000100000000000 #define MOD 1000000007 #define control cout<<" passed "<<'\n'; using namespace std; typedef long long ll; typedef unsigned long long ull; typedef vector vi; typedef vector vll; typedef vector vull; typedef vector vs; void speed() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); } struct edge { int x,y; edge operator+(edge e)const { edge res; res.x=e.x+x; res.y=e.y+y; return res; } }; edge shape[16]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; bool used[MAXN][MAXN]; int n,m; bool a[MAXN][MAXN]; void bfs(edge beg) { used[beg.x][beg.y]=1; queue q; q.push(beg); while(!q.empty()) { edge w=q.front(); q.pop(); for(int i=0;i<8;i++) { edge nb=w+shape[i]; if(nb.x<1||nb.x>n||nb.y<1||nb.y>m)continue; if(used[nb.x][nb.y]==0) { bool lamp=0; for(int j=0;j<8;j++) { edge e=nb+shape[j]; if(e.x<1||e.x>n||e.y<1||e.y>m)break; if(a[e.x][e.y]==1&&e.x!=w.x&&e.y!=w.y) { //cout<>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; if(a[i][j])used[i][j]=1; } } int ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(used[i][j]==0&&a[i][j+1]==0&&a[i+1][j+1]==0&&a[i+1][j]==0&&a[i+1][j-1]==0&&a[i][j-1]==0&&a[i-1][j-1]==0&&a[i-1][j]==0&&a[i-1][j+1]==0) { ans++; edge e; e.x=i; e.y=j; bfs(e); } } } /*for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cout<