#include // std::string #include // std::cout #include using namespace std; int n; int m; int a[501][501]; int Are1s(int i1, int j1, int i2, int j2, int i3, int j3) { if (i1 < 0 || j1 < 0 || i2 < 0 || j2 < 0 || i3 < 0 || j3 < 0) return 0; if (i1 >= n || j1 >= m || i2 >= n || j2 >= m || i3 >= n || j3 >= m) return 0; return (a[i1][j1] && a[i2][j2] && a[i3][j3]); } int PartOfRect(int i, int j) { return // 11 // 1* Are1s(i-1, j-1, i-1, j, i, j-1) || // *1 // 11 Are1s(i, j+1, i+1, j, i+1, j+1) || // 11 // *1 Are1s(i-1, j, i-1, j+1, i, j+1) || // 1* // 11 Are1s(i, j-1, i+1, j-1, i+1, j); } int n_up(int i, int j) { if (i-1<0) return 0; return a[i-1][j]; } int n_down(int i, int j) { if (i+1>=n) return 0; return a[i+1][j]; } int n_left(int i, int j) { if (j-1<0) return 0; return a[i][j-1]; } int n_right(int i, int j) { if (j+1>=m) return 0; return a[i][j+1]; } void TryRemove(int i, int j) { if (a[i][j] == 0) return; // if it has at least 3 bad neighbours, remove it int good_neighbours = n_up(i,j) + n_down(i,j) + n_left(i,j) + n_right(i,j); if (good_neighbours <= 1) { a[i][j]=0; if (n_up(i,j)) TryRemove(i-1,j); if (n_down(i,j)) TryRemove(i+1, j); if (n_left(i,j)) TryRemove(i, j-1); if (n_right(i,j)) TryRemove(i, j+1); } } int main() { // read input string tmp; getline(cin, tmp); stringstream ss(tmp); ss >> n; ss >> m; for(int i=0; i