本題可以用高斯消元法求解。
或者使用如下方法進行遍歷搜索。
1.枚舉第一行的情況:
可能是 0 0 0 0 0 0
1 0 0 0 0 0
0 1 0 0 0 0
……
1 1 1 1 1 1
2.如果按照第一行的熄燈方法 可以將燈全部熄滅 則找到答案
#include<iostream>
using namespace std;
int puzzle[6][8],press[6][8];
bool guess(){
for(int i=1;i<5;i++){
for(int j=1;j<7;j++){
press[i+1][j]=
(puzzle[i][j]+press[i][j]+press[i-1][j]+press[i][j-1]+press[i][j+1])%2;
}
}
for(int i=1;i<7;i++){
if((press[5][i-1]+press[5][i]+press[5][i+1]+press[4][i])%2!=puzzle[5][i])
return false;
}
return true;
}
void enumate(){
for(int i=1;i<7;i++){
press[1][i]=0;
}
int c;
while(guess()==false){
press[1][1]++;
c=1;
while(press[1][c]>1){
press[1][c]=0;
c++;
press[1][c]++;
}
}
return;
}
int main(){
int cases;
cin>>cases;
for(int casea=1;casea<=cases;casea++){
memset(press,0,sizeof(press));
for(int i=1;i<6;i++){
for(int j=1;j<7;j++){
cin>>puzzle[i][j];
}
}
enumate();
cout<<"PUZZLE #"<<casea<<endl;
for(int i=1;i<6;i++){
for(int j=1;j<7;j++){
cout<<press[i][j]<<' ';
}
cout<<endl;
}
}
}