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

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

在Lights Out 中,一共有5行6列的灯,每盏灯初始可能关着,可能开着,你的目的是必须要将所有的灯都关闭。
第一行包含一个T,代表玩几次游戏
每次游戏,输入一个5行6列的矩阵,表示每个灯的初始状态,0代表一开始灯是关着的,1代表一开始灯是开着的。
对于每次游戏,输出一个能关掉所有灯的方案,包含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 ***=true;
            for(int i=0; i<6; i++)
            {
                if(b[4][i]==1)***=false;
            }
            if(***)
            {
                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;
}