I - EXTENDED LIGHTS OUT

题目传送门:I - EXTENDED LIGHTS OUT 在这里插入图片描述在这里插入图片描述样例

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
样例输出:
PUZZLE #1
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
PUZZLE #2
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

题目大意: 给你一个5*6(只包含0,1)的矩阵,1表示当前位置的灯是亮着的,0则是表示当前灯是灭的,你可以把每个位置的灯的状态改变(即0变1,1变0)但是你改变一个位置,那么它相邻的上下左右的灯的状态也随之改变,问你改变哪些位置,可以使最终的灯全部熄灭。

思路:对于每一个矩阵来说,我们可以先控制第一行的操作,就是说我们枚举第一行的要按的位置,因为总共就六位,所以一共64种状态,按顺序枚举一下就可以,当我们第一行的状态确定了之后,那么我们在下一行的时候,我们要保证前一行的状态要全部变为0,所以我们下一行的操作和我们当前行的最终状态一致(因为,假设a[i][j]为1,我们下一行的a[i+1][j]也必定为1,因为我们要从上往下来找的话,我们就要保证我们之前走过的行都为0。那么当前行的改变,就可以用下一行的操作来实现),以次类推,那么我们枚举了第一行的状态,剩下几行的状态就也出来了,我们只需要找到,最后一行状态全为0的就行了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=200005;
int a[10][10];
int ans[10][10];
int b[10][10];
void init()
{
    for(int i=1; i<=5; i++)
    {
        for(int j=1; j<=6; j++)
        {
            b[i][j]=a[i][j];
        }
    }
}
int main()
{
    int t;
    int tot=1;
    scanf("%d",&t);
    while(t--)
    {
        for(int i=1; i<=5; i++)
        {
            for(int j=1; j<=6; j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        for(int i=0; i<=63; i++)
        {
            init();
            for(int j=0; j<6; j++)
            {
                ans[1][j+1]=(i>>j)&1;
            }
            for(int j=1; j<=6; j++)
            {
                if(ans[1][j])
                {
                    b[1][j]^=1;
                    b[1][j+1]^=1;
                    b[1][j-1]^=1;
                    b[2][j]^=1;
                }
            }
            for(int j=2; j<=5; j++)
            {
                for(int k=1; k<=6; k++)
                {
                    ans[j][k]=b[j-1][k];
                    if(ans[j][k])
                    {
                        b[j][k]^=1;
                        b[j][k+1]^=1;
                        b[j][k-1]^=1;
                        b[j+1][k]^=1;
                    }
                }
            }
            if(b[5][1]==0&&b[5][2]==0&&b[5][3]==0&&b[5][4]==0&&b[5][5]==0&&b[5][6]==0)
            {
                break;
            }
        }
        printf("PUZZLE #%d\n",tot++);
        for(int i=1; i<=5; i++)
        {
            for(int j=1; j<=6; j++)
            {
                printf("%d ",ans[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43402296/article/details/105406048