1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #include<iostream> #include<cstring> using namespace std;
#define maxn 16
int tile[maxn][maxn]; int filp[maxn][maxn]; int opt[maxn][maxn]; int m, n;
const int dx[5]={-1,0,0,0,1}; const int dy[5]={0,-1,0,1,0};
int get(int x, int y) { int c = tile[x][y]; for(int i = 0;i < 5;i++) { int x1 = x + dx[i], y1 = y + dy[i]; if(0 <= x1 && x1 < m && 0 <= y1 && y1 < n) c += filp[x1][y1]; } return c % 2; }
int calc() { for(int i = 1;i < m;i++) { for(int j = 0;j < n;j++) { if(get(i - 1, j) != 0) { filp[i][j] = 1; } } }
for(int i = 0;i < n;i++) if(get(m - 1, i) != 0) return -1;
int res = 0; for(int i = 0;i < m;i++) { for(int j = 0;j < n;j++) { res += filp[i][j]; } } return res; }
void solve() { int res = -1;
for(int i = 0;i < (1 << n); i++) { memset(filp, 0, sizeof(filp)); for(int j = 0;j < n;j++) { filp[0][n - j - 1] = i >> j & 1; }
int num = calc(); int cnt = 1; if(num >= 0 && (res < 0 || res > num)) { res = num; memcpy(opt, filp, sizeof(filp)); } }
if(res < 0) { printf("IMPOSSIBLE\n"); } else { for(int i = 0;i < m;i++) { for(int j = 0;j < n;j++) { printf("%d%c", opt[i][j], j + 1 == n ? '\n' : ' ');
} } } }
int main() { cin >> m >> n; for(int i = 0;i < m;i++) { for(int j = 0;j < n;j++) { cin >> tile[i][j]; } } solve(); return 0; }
|