枚举第一行所有可能的的情况
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int map[6][7],maze[6][7],ans[6][7]; int dir[5][2]={0,0,1,0,0,1,0,-1,-1,0}; void press(int i,int j) { int x,y; for(int k=0;k<5;k++) { x=i+dir[k][0]; y=j+dir[k][1]; if(x>=1&&x<=5&&y>=1&&y<=6) maze[x][y]=!maze[x][y]; } } void example() { for(int i=1;i<=64;i++) { memset(ans,0,sizeof(ans)); memcpy(maze, map, sizeof(map)); int t=i; for(int j=6;j>=1;j--) ans[1][j]=t&1,t>>=1; for(int j=1;j<=6;j++) if(ans[1][j]) press(1,j); for(int row=2;row<=5;row++) for(int j=1;j<=6;j++) if(maze[row-1][j]) press(row,j),ans[row][j]=1; int flag=1; for(int j=1;j<=6;j++) if(maze[5][j]) {flag=0;break;} if(flag) return ; } } int main () { int t; scanf("%d",&t); while(t--) { for(int i=1;i<=5;i++) for(int j=1;j<=6;j++) cin>>map[i][j]; example(); for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++) printf("%d ",ans[i][j]); printf("%d ",ans[i][6]); } printf(" "); } return 0; }