枚举第一行的64种可能,然后对于除第一行的每一个i,j值,若[i-1,j]亮着灯就要把[i,j]开关开起来关掉[i-1,j]的灯
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
bool maze[5][6],ans[5][6],temp[5][6];
int cnt[5][6];
int di[]={0,-1,1,0,0},dj[]={0,0,0,-1,1};
vector<int>stak;
bool dfs(int curi){
if(curi==6){
memcpy(temp,maze,sizeof(maze));
for (int i=0;i<6;++i){
if(stak[i]==1){
ans[0][i]=1;
for (int k=0;k<5;++k){
int ni=0+di[k],nj=i+dj[k];
if(ni>=0&&ni<5&&nj>=0&&nj<6){
temp[ni][nj]^=1;
}
}
}else{
ans[0][i]=0;
}
}
for (int i=1;i<5;++i){//只要i-1 j的灯还是亮点的 i j开关就要开起来,关闭掉上面的灯
for (int j=0;j<6;++j){
if(temp[i-1][j]==1){
ans[i][j]=1;
for (int k=0;k<5;++k){
int ni=i+di[k],nj=j+dj[k];
if(ni>=0&&ni<5&&nj>=0&&nj<6){
temp[ni][nj]^=1;
}
}
}else{
ans[i][j]=0;
}
}
}
for (int i=0;i<5;++i){//判断是否全部关闭了
for (int j=0;j<6;++j){
if(temp[i][j])return false;
}
}
return true;
}
stak.push_back(1);
if(dfs(curi+1))return true;
stak.pop_back();
stak.push_back(0);
if(dfs(curi+1))return true;
stak.pop_back();
return false;
}
int main(){
int t,cas=1;
scanf("%d",&t);
while (t--){
for (int i=0;i<5;++i){
for (int j=0;j<6;++j){
int temp;
scanf("%d",&temp);
maze[i][j]=temp;
}
}
stak.clear();
dfs(0);
printf("PUZZLE #%d\n",cas++);
for (int i=0;i<5;++i){
for (int j=0;j<6;++j){
if(j>0)printf(" ");
printf("%d",ans[i][j]);
}
printf("\n");
}
}
return 0;
}