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

目录
相关文章
【期末不挂科-单片机考前速过系列P2】(第二章:搞定寻址方式)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P2】(第二章:搞定寻址方式)经典例题盘点(带图解析)
|
2月前
|
存储 物联网
【洛谷 P1135】奇怪的电梯 题解(广度优先搜索)
这是一个关于奇怪电梯的编程问题摘要: - 电梯在每层停,且每层有特定数字 $K_i$ 决定上/下按钮的功能。 - 目标是从 $A$ 楼到 $B$ 楼,求最少按键次数,若无法到达则输出 `-1`。 - 输入包括 $N$(楼层数)、$A$(起点)和 $B$(终点),以及每层的 $K_i$ 数字。 - 使用广度优先搜索(BFS)解决,通过队列存储访问过的楼层,避免重复并计算步数。 - 当到达目标楼层时返回步数,队列空时返回 `-1`。
14 0
|
3月前
【错题集-编程题】过河卒(动态规划-路径问题)
【错题集-编程题】过河卒(动态规划-路径问题)
|
3月前
|
开发框架 .NET
【期末不挂科-单片机考前速过系列P4】(第四章:32题搞定基本指令例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P4】(第四章:32题搞定基本指令例题)经典例题盘点(带图解析)
|
3月前
|
C语言 C++
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
|
3月前
|
存储 芯片
【期末不挂科-单片机考前速过系列P12】(第十二章:单片机的并行拓展例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P12】(第十二章:单片机的并行拓展例题)经典例题盘点(带图解析)
学C的第八天(完成猜字谜游戏复习之前的内容;了解goto转向语句;补充知识点;练习,学习试除法和辗转相除法)-2
3.写一个代码,打印100-200之间的素数:(新思路:试除法) (判断i是否为素数:用 2到i-1 之间的数字去试除 i,如果能整除则i不是素数)
|
3月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 202. 快乐数 算法解析
☆打卡算法☆LeetCode 202. 快乐数 算法解析
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
|
C语言
学C的第八天(完成猜字谜游戏复习之前的内容;了解goto转向语句;补充知识点;练习,学习试除法和辗转相除法)-1
复习之前学C的内容: 猜数字游戏: 1. 电脑会随机生成一个数 2. 猜数字: a> 猜大了,提醒猜大了,继续猜 b> 猜小了,提醒猜小了,继续猜 c> 猜对了,恭喜你,猜对了,结束游戏 3. 玩完一把不过瘾可以继续玩,不用退出程序