Description




Lights Out 是一款非常考验人智力的益智游戏,你必须要尝试关闭所有的灯。

游戏玩法:当你关掉或打开一个灯的时候,它周围(仅包括上下左右,斜对角的不算)的灯就会做相反的反应,譬如周围的灯本来是关掉的,当你关掉火或者打开中间的那个灯的时候,周围的灯就会自动变成打开,反之亦然。

在Lights Out 中,一共有5行6列的灯,每盏灯初始可能关着,可能开着,你的目的是必须要将所有的灯都关闭。




Input




第一行包含一个T,代表玩几次游戏
每次游戏,输入一个5行6列的矩阵,表示每个灯的初始状态,0代表一开始灯是关着的,1代表一开始灯是开着的。




Output




对于每次游戏,输出一个能关掉所有灯的方案,包含5行6列的矩阵,0代表按过这个灯的按钮,1代表没有按过这个灯的按钮。每组输出多输出一个空行。






2
0 1 1 0 1 0
1 0 0 1 1 1
0 0 1 0 0 1
1 0 0 1 0 1
0 1 1 1 0 0
0 0 1 0 1 0
1 0 1 0 1 1
0 0 1 0 1 1
1 0 1 1 0 0
0 1 0 1 0 0








1 0 1 0 0 1
1 1 0 1 0 1
0 0 1 0 1 1
1 0 0 1 0 0
0 1 0 0 0 0

1 0 0 1 1 1
1 1 0 0 0 0
0 0 0 1 0 0
1 1 0 1 0 1
1 0 1 1 0 1





【题意】如题所示

【分析】只需要暴力枚举每一行(列)的状态,然后根据第一行推出后面行的状态,最后判断是否满足条件即可。注意,是输出按的方案。

【AC代码】

#include <bits/stdc++.h>
using namespace std;
int maze[5][6];
int b[5][6];
int ans[5][6];
void press(int x,int y)
{
ans[x][y]=1;
b[x][y] = 1-b[x][y];
if(x>0) b[x-1][y] = 1-b[x-1][y];
if(x<4) b[x+1][y] = 1-b[x+1][y];
if(y>0) b[x][y-1] = 1-b[x][y-1];
if(y<5) b[x][y+1] = 1-b[x][y+1];
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
for(int i=0; i<5; i++)
{
for(int j=0; j<6; j++)
{
scanf("%d",&maze[i][j]);
}
}
for(int s=0;s<(1<<6);s++)
{
memset(ans,0,sizeof(ans));
for(int i=0; i<5; i++)
{
for(int j=0; j<6; j++)
{
b[i][j] = maze[i][j];
}
}
for(int i=0; i<6; i++)
{
if(s&(1<<i)) press(0,i);
}
for(int i=1; i<5; i++)
{
for(int j=0; j<6; j++)
{
if(b[i-1][j]==1)press(i,j);
}
}
bool fuck=true;
for(int i=0; i<6; i++)
{
if(b[4][i]==1)fuck=false;
}
if(fuck)
{
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
printf("%d ",ans[i][j]);
}
printf("%d\n",ans[i][5]);
}
break;
}
}
printf("\n");
}
return 0;
}