每日一题<AcWing 95. 费解的开关>

简介: 每日打卡

image.png

依题意,题目给我们一个5X5的灯泡,改变一个灯泡的开关伴随的是上下左右的灯泡也会改变亮暗状态。我们可以通过枚举决定是否按第一层的各个开关,由于变换的范围是上下左右,若此时第一层某个位置的灯泡还是灭着的,那第二层的相同位置就必须要按一次开关,相反若灯泡是亮着的就不能再按一次。以此类推即只要第一行的初始状态确定,则接下来的层按不按开关的状态就已经确定了。最后只要判断当前是否为全亮的状态便可以判断方案的有效性。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 6;
char g[N][N], backup[N][N];
void turn(int x, int y)   //模拟按一次开关
{
    int dx[5] = { -1,0,1,0,0 };
    int dy[5] = { 0,1,0,-1,0 };
    for (int i = 0; i < 5; i++)
    {
        int ax = x + dx[i];
        int ay = y + dy[i];
        if (ax >= 5 || ax < 0 || ay >= 5 || ay < 0) continue;
        g[ax][ay] ^= 1;
    }
}
int main()
{
    int n;
    scanf("%d", &n);
    while (n--)
    {
        for (int i = 0; i < 5; i++) cin >> g[i]; //以字符串的形式读入
        int ans = 10;
        for (int i = 0; i < 32; i++)   //通过 位 来枚举
        {
            memcpy(backup, g, sizeof(g));  //设置备份
            int count = 0;
            for (int j = 0; j < 5; j++)
            {
                if (i >> j & 1)   //确定每位为1则按一次开关
                {
                    count++;
                    turn(0, j);
                }
            }
            for (int j = 0; j < 4; j++)  //类推模拟下面几层
            {
                for (int z = 0; z < 5; z++)
                {
                    if (g[j][z] == '0')
                    {
                        count++;
                        turn(j + 1, z);
                    }
                }
            }
            bool sign = false;
            for (int j = 0; j < 5; j++)  //检测最后结果
            {
                if (g[4][j] == '0')
                {
                    sign = true;
                    break;
                }
            }
            if (!sign)
            {
                ans = min(ans, count);
            }
            memcpy(g, backup, sizeof(g));  //回归备份
        }
        if (ans > 6)
        {
            ans = -1;
        }
        printf("%d\n", ans);
    }
    return 0;
}

image.gif

目录
相关文章
|
4月前
|
人工智能 算法 BI
AcWing 505. 火柴排队(每日一题)
AcWing 505. 火柴排队(每日一题)
|
C语言
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
74 2
|
9月前
代码随想录 Day50 单调栈 LeetCodeT503 下一个最大元素II T42接雨水
代码随想录 Day50 单调栈 LeetCodeT503 下一个最大元素II T42接雨水
38 0
|
9月前
|
容器
每日一题——接雨水(单调栈)
每日一题——接雨水(单调栈)
|
机器学习/深度学习
蓝桥 金陵十三钗 (状压+记忆化搜索)
蓝桥 金陵十三钗 (状压+记忆化搜索)
|
算法
费解的开关/翻硬币
费解的开关/翻硬币
134 0
|
算法
《蓝桥杯每日一题》哈希·AcWing 2058. 笨拙的手指
《蓝桥杯每日一题》哈希·AcWing 2058. 笨拙的手指
80 0
洛谷P1135 奇怪的电梯——广搜
洛谷P1135 奇怪的电梯——广搜
114 0
|
算法
【AcWing&&牛客】打表找规律
【AcWing&&牛客】打表找规律
96 0
|
人工智能 移动开发
【蓝桥杯集训·每日一题】AcWing 3805. 环形数组
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 线段树
114 0