反转开关问题,枚举第一行的状态然后从第二行开始翻转即可。
#include <cstdio>
#include <cstring>
const int dx[] = {-1, 0, 0, 0, 1};
const int dy[] = {0, -1, 0, 1, 0};
int map[8][8];
int f[8][8];
int get(int x, int y) {
int c = map[x][y];
for (int i = 0; i < 5; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < 5 && ny >= 0 && ny < 6) {
c += f[nx][ny];
}
}
return c % 2;
}
bool calc() {
for (int i = 1; i < 5; i++) {
for (int j = 0; j < 6; j++) {
if (get(i-1, j) == 1) {
f[i][j] = 1;
}
}
}
for (int j = 0; j < 6; j++) {
if (get(4, j) == 1) {
return false;
}
}
return true;
}
int main(int argc, char const *argv[]) {
int t;
scanf("%d", &t);
for (int c = 0; c < t; c++) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
scanf("%d", &map[i][j]);
}
}
for (int i = 0; i < 1 << 6; i++) {
memset(f, 0, sizeof(f));
for (int j = 0; j < 6; j++) {
f[0][6-j-1] = i >> j & 1;
}
if (calc()) {
printf("PUZZLE #%d\n", c+1);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
if (j) {
putchar(' ');
}
printf("%d", f[i][j]);
}
putchar('\n');
}
break;
}
}
}
return 0;
}