分类里说的是高斯消元,但我没看出来,就先搜给搜出来了,一会看看别人怎么消的。
//============================================================================
// Name : 1222.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int in[10][10], b[10][10];
int N, tag;
void press(int x, int y){
in[x][y] = in[x][y] == 1?0:1;
// printf("%d %d %d\n", x, y, in[x][y]);
if(x > 1){
in[x-1][y] = in[x-1][y] == 1?0:1;
}
if(x < 5){
in[x+1][y] = in[x+1][y] == 1?0:1;
}
if(y > 1){
in[x][y-1] = in[x][y-1] == 1?0:1;
}
if(y < 6){
in[x][y+1] = in[x][y+1] == 1?0:1;
}
}
void dfs(int m){
if(tag == 1) return;
if(m == 7){
int flag = 1;
for(int i = 2;i <= 5;i++){
for(int j = 1;j <= 6;j++){
if(in[i-1][j] == 1){
press(i, j);
b[i][j] = 1;
}
else{
b[i][j] = 0;
}
}
}
for(int i = 1;i <= 6;i++){
if(in[5][i] != 0){
flag = 0;
}
}
if(flag == 0){
for(int i = 2;i <= 5;i++){
for(int j = 1;j <= 6;j++){
if(b[i][j] == 1){
press(i, j);
}
}
}
return;
}
// for(int i = 1;i <= 5;i++){
// for(int j = 1;j <= 6;j++){
// printf("%d ", in[i][j]);
// }
// printf("\n");
// }printf("\n");
tag = 1;
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= 6;j++){
if(j == 1){
printf("%d", b[i][j]);
}
else{
printf(" %d", b[i][j]);
}
}
printf("\n");
}
}
else{
b[1][m] = 0;
dfs(m+1);
press(1, m);
b[1][m] = 1;
dfs(m+1);
press(1, m);
}
}
int main() {
scanf("%d", &N);
for(int T = 1;T <= N;T++){
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= 6;j++){
scanf("%d", &in[i][j]);
}
}
tag = 0;
printf("PUZZLE #%d\n",T);
dfs(1);
// press(1, 6);
// in[1][1] = in[1][1] == 1?0:1;
// for(int i = 1;i <= 5;i++){
// for(int j = 1;j <= 6;j++){
// printf("%d ", in[i][j]);
// }
// printf("\n");
// }
}
return 0;
}