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

目录
相关文章
|
29天前
【剑指offer】编程习题集附上答案
【剑指offer】编程习题集附上答案
14 3
|
5月前
|
算法 图计算
力扣经典150题第十六题:接雨水
力扣经典150题第十六题:接雨水
28 0
|
5月前
|
存储 物联网
【洛谷 P1135】奇怪的电梯 题解(广度优先搜索)
这是一个关于奇怪电梯的编程问题摘要: - 电梯在每层停,且每层有特定数字 $K_i$ 决定上/下按钮的功能。 - 目标是从 $A$ 楼到 $B$ 楼,求最少按键次数,若无法到达则输出 `-1`。 - 输入包括 $N$(楼层数)、$A$(起点)和 $B$(终点),以及每层的 $K_i$ 数字。 - 使用广度优先搜索(BFS)解决,通过队列存储访问过的楼层,避免重复并计算步数。 - 当到达目标楼层时返回步数,队列空时返回 `-1`。
40 0
|
6月前
【错题集-编程题】过河卒(动态规划-路径问题)
【错题集-编程题】过河卒(动态规划-路径问题)
|
C语言 C++
C语言刷题系列——7.(洛谷)上学迟到
C语言刷题系列——7.(洛谷)上学迟到
284 0
|
6月前
|
算法 Java C++
字符串删减(蓝桥杯每日一题)
字符串删减(蓝桥杯每日一题)
65 0
|
12月前
|
算法 测试技术 容器
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
44 1
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
|
算法 C++ Python
【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ
【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ
100 0
蓝桥杯之单片机学习(二十七)——电子钟(附题目和完整代码)
蓝桥杯之单片机学习(二十七)——电子钟(附题目和完整代码)
141 0
蓝桥杯之单片机学习(二十七)——电子钟(附题目和完整代码)