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

目录
相关文章
|
数据采集 中间件 Python
Python爬虫:scrapy管理服务器返回的cookie
Python爬虫:scrapy管理服务器返回的cookie
520 0
|
11月前
|
小程序 UED
axure rp原型设计基础
Axure RP原型设计基础‌
259 4
|
存储 安全 API
Windows Server 2022 21H2 本地域权限提升漏洞(PetitPotam)
Windows Server 2022 Standard/Datacenter 存在本地域权限提升漏洞,攻击者可通过使用PetitPotam工具进行获取服务器SYSTEM权限。
785 1
|
数据可视化 算法 Python
python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化
python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化
|
前端开发
【HTML】过年不能放烟花,那就放电子烟花
闲谈 大家回家过年可能都多多少少放过些🧨,但是有些在城市上过年的小伙伴可能就没有机会放鞭炮了。不过没关系,我们懂技术,我们用技术自娱自乐,放电子烟花,总不可能被警长叔叔敲门问候吧。
151 0
上标下标汇总
上标下标汇总
2477 0
|
SQL 存储 Oracle
kettle从oracle到mysql数据迁移
kettle从oracle到mysql数据迁移
1748 0
|
小程序 前端开发
uniapp 微信小程序v-show 不显示
uniapp 微信小程序v-show 不显示
541 0
|
机器学习/深度学习 算法 数据挖掘
Sentieon | 每周文献-Long Read Sequencing(长读长测序)-第七期
Sentieon | 每周文献-Long Read Sequencing(长读长测序)-第七期
216 0
|
人工智能 物联网 持续交付
Alpaca-CoT项目原作解读:多接口统一的轻量级LLM指令微调平台
Alpaca-CoT项目原作解读:多接口统一的轻量级LLM指令微调平台
589 0