AcWing 95. 费解的开关(递推)

题目链接

活动 - AcWing 本活动组织刷《算法竞赛进阶指南》,系统学习各种编程算法。主要面向有一定编程基础的同学。https://www.acwing.com/problem/content/97/

题解

只要第一行开关的状态确定,则所有开关的状态都可以被推出来。第一行开关总共有种操作方法,可以先二进制枚举出第一行的状态,其它行的状态就可以从上一行推出来。上一行为0,下一行必须得变;上一行为1,下一行必须不变。最终,如果最后一行全为1且步数小于等于6,则可以使所有的灯全变亮,否则不能。

代码

cpp 复制代码
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 6;

char g[N][N], bg[N][N];
int dx[5] = {-1, 0, 1, 0, 0}, dy[5] = {0, 1, 0, -1, 0};

void turn(int x, int y)  // 按一下第x行第y列的开关
{
    for (int i = 0; i < 5; i++)
    {
        int a = x + dx[i], b = y + dy[i];
        if (a < 0 || a >= 5 || b < 0 || b >= 5) continue;
        g[a][b] ^= 1;
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        for (int i = 0; i < 5; i++) scanf("%s", bg[i]);
        
        int res = 10;
        for (int op = 0; op < 32; op++)
        {
            int cnt = 0;
            memcpy(g, bg, sizeof g);
            // 操作第一行的开关
            for (int i = 0; i < 5; i++)
                if (op >> i & 1)
                {
                    turn(0, i);
                    cnt++;
                }
                
            // 递推出第1~4行开关的状态
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 5; j++)
                    if (g[i][j] == '0')
                    {
                        turn(i + 1, j);
                        cnt++;
                    }
            
            // 检查最后一行灯是否全亮
            bool success = true;
            for (int i = 0; i < 5; i++)
                if (g[4][i] == '0')
                    success = false;
            if (success && res > cnt) res = cnt;
        }
        
        if (res > 6) res = -1;
        printf("%d\n", res);
    }
    
    return 0;
}
相关推荐
追随者永远是胜利者2 分钟前
(LeetCode-Hot100)17. 电话号码的字母组合
java·算法·leetcode·职场和发展·go
不想看见4043 分钟前
Shortest Bridge -- 广度优先搜索 --力扣101算法题解笔记
算法·leetcode·宽度优先
流云鹤10 分钟前
2026牛客寒假算法基础集训营5(B D G J F )
算法
教男朋友学大模型11 分钟前
LoRA 为什么必须把一个矩阵初始化为0
人工智能·算法·面试·求职招聘
得一录15 分钟前
Python 算法高级篇:布谷鸟哈希算法与分布式哈希表
python·算法·aigc·哈希算法
啊吧啊吧abab16 分钟前
二分查找与二分答案
c++·算法·二分
AC赳赳老秦18 分钟前
2026 智能制造趋势:DeepSeek 助力“黑灯”工厂运营,实现生产流程自动化
网络·数据结构·算法·安全·web安全·prometheus·deepseek
流云鹤22 分钟前
2026牛客寒假算法基础集训营6(K H G B A)
算法
程序员酥皮蛋24 分钟前
hot 100 第三十题 30. 两两交换链表中的节点
数据结构·算法·leetcode·链表
寻寻觅觅☆25 分钟前
东华OJ-基础题-131-8皇后·改(C++)
c++·算法·深度优先