费解的开关

Posted baseai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了费解的开关相关的知识,希望对你有一定的参考价值。

题目地址

递推递归?不像。

状态压缩?不够全面。

Dfs,Bfs,枚举大法好? 也不是。

题目难度?八皇后差不多的难度吧。反正对于大佬简单,对于我这种蒟蒻难就对了。

模拟?对,就是模拟,膜拟,膜你... ...

题解

考虑一种方法,枚举第一层开关灯——因为我们只要第一层知道了,或者说是固定了,后面的开灯方案就只有一种了,也就是固定了。

对于 2~5 层,如果 \((x,y)\) 这一格是不亮的,我们只能在它的下面这格点一下,因为上面固定了

然后我们还能发现,对于第 5 层(第5层下面就没有格子了),我们修改不了了。于是我们可以从第 5 层判断答案。

直接看我盗的图吧。

初始矩阵是这样,记住,第 1 层已经固定好了。

技术图片

接着如果我们要修改第 1 层,就要点第 2 层的格子。

技术图片

然后我们要修改第 2 层,就要点第 3 层的格子。

技术图片

然后同理。

技术图片

同理

技术图片

最后我们还发现这种情况行不通。

想到枚举第 1 层开关灯,(状态压缩你值得拥有!!!)状压当然是不错的选择。

然后你就可以轻松切掉这题啦

Code

#include<bits/stdc++.h>
#define nx x+dx[i]
#define ny y+dy[i]
#define check(x,y) (x>=1&&x<=5&&y>=1&&y<=5)
#define INF 0x3f3f3f
using namespace std;
const int dx[] = 0,0,0,1,-1;
const int dy[] = 0,1,-1,0,0;
int n,step,ans=INF;
bool a[6][6],b[6][6];
inline void click(int x,int y)     //click 点击 
    for(int i=0;i<5;++i) 
        if(check(nx,ny)) 
            b[nx][ny] ^= 1;
        
    

int main()

    scanf("%d",&n);
    int maxn = (1<<5) - 1;
    while(n--) 
        ans = INF;
        for(int i=1;i<=5;++i)
            for(int j=1;j<=5;++j)
                scanf("%1d",&a[i][j]);
        for(int bit=0;bit<=maxn;++bit) 
            for(int i=1;i<=5;++i)
                for(int j=1;j<=5;++j)
                    b[i][j] = a[i][j];
            step = 0;
            for(int i=0;i<5;++i) 
                bool x = bit & (1<<i);
                if(x) 
                    click(1,i+1); step++;
                
               //预处理 
            for(int i=1;i<=4;++i) 
                for(int j=1;j<=5;++j) 
                    if(!b[i][j])  
                        click(i+1,j); step++;
                    
                
            
            if(step > 6) continue;
            bool flag = 1;
            for(int i=1;i<=5;++i) 
                if(!b[5][i]) flag = 0;
            
            if(flag) ans = min(ans,step);
        
        if(ans==INF) puts("-1");
        else printf("%d\n",ans);
    
    return 0;

大家可千万别学我,盗图是极其可耻的行为!!!

以上是关于费解的开关的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛进阶指南》-AcWing-95. 费解的开关-题解

《算法竞赛进阶指南》-AcWing-95. 费解的开关-题解

TyvjP1266 费解的开关

[递推] aw95. 费解的开关(二维递推+开关问题+二进制枚举)

95. 费解的开关(Acwing)(分析+递推)

费解的开关/翻硬币