每日一题<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

目录
相关文章
|
3月前
|
算法 Java C++
字符串删减(蓝桥杯每日一题)
字符串删减(蓝桥杯每日一题)
35 0
|
5月前
|
算法 测试技术 容器
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
28 1
|
8月前
|
算法
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
|
8月前
|
算法
[算法刷题题解笔记] 洛谷 P1003 [NOIP2011 提高组] 铺地毯 [枚举]
[算法刷题题解笔记] 洛谷 P1003 [NOIP2011 提高组] 铺地毯 [枚举]
|
9月前
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
42 0
|
10月前
|
机器学习/深度学习 存储 算法
代码随想录训练营day30| 332.重新安排行程 51. N皇后 37. 解数独
代码随想录训练营day30| 332.重新安排行程 51. N皇后 37. 解数独
|
存储
【寒假每日一题】AcWing 4454. 未初始化警告
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 continue与break的区别及作用
42 0
蓝桥杯之单片机学习(二十七)——电子钟(附题目和完整代码)
蓝桥杯之单片机学习(二十七)——电子钟(附题目和完整代码)
100 0
蓝桥杯之单片机学习(二十七)——电子钟(附题目和完整代码)
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
314 0
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
蓝桥杯之单片机学习(二十五)——温度记录器(附题目和完整代码)
蓝桥杯之单片机学习(二十五)——温度记录器(附题目和完整代码)
175 0
蓝桥杯之单片机学习(二十五)——温度记录器(附题目和完整代码)