• 洛谷 P2040 打开所有的灯


    题目背景

    pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz。。。

    题目描述

    这个灯很奇(fan)怪(ren),点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开这些灯。

    例如 0 1 1

    1 0 0

    1 0 1

    点一下最中间的灯【2,2】就变成了

    0 0 1

    0 1 1

    1 1 1

    再点一下左上角的灯【1,1】就变成了

    1 1 1

    1 1 1

    1 1 1

    达成目标。最少需要2步。

    输出2即可。

    输入输出格式

    输入格式:

     

    九个数字,3*3的格式输入,每两个数字中间只有一个空格,表示灯初始的开关状态。(0表示关,1表示开)

     

    输出格式:

     

    1个整数,表示最少打开所有灯所需要的步数。

     

    输入输出样例

    输入样例#1: 复制
    0  1  1
    1  0  0
    1  0  1
    输出样例#1: 复制
    2

    说明

    这个题水不水,就看你怎么考虑了。。。。

    思路:看数据范围,n*n==9,所以如果搜索的话,时间复杂度为2^9可以跑过去。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int ans=0x7f7f7f7f;
    bool map[10][10],vis[10][10];
    bool judge(){
        int bns=0;
        for(int i=1;i<=3;i++)
            for(int j=1;j<=3;j++)
                if(map[i][j])    bns++;
        if(bns==9)    return true;
        else return false;
    }
    void dfs(int sum){
        if(judge()){
            ans=min(ans,sum);
            return ;
        }
        for(int i=1;i<=3;i++)
            for(int j=1;j<=3;j++)
                if(!vis[i][j]){
                    vis[i][j]=1;map[i][j]=!map[i][j];
                    map[i-1][j]=!map[i-1][j];map[i][j-1]=!map[i][j-1];
                    map[i+1][j]=!map[i+1][j];map[i][j+1]=!map[i][j+1];
                    dfs(sum+1);map[i][j]=!map[i][j];
                    map[i-1][j]=!map[i-1][j];map[i][j-1]=!map[i][j-1];
                    map[i+1][j]=!map[i+1][j];map[i][j+1]=!map[i][j+1];vis[i][j]=0;
                }
    }
    int main(){
        for(int i=1;i<=3;i++)
            for(int j=1;j<=3;j++)
                scanf("%d",&map[i][j]);
        dfs(0);
        cout<<ans;
    }

    但是我们要谈就更优异的算法,我们知道,改变一盏偶数次,相当于没有改变,而改变基数词,相当于改变一次。所以这个题目可以转成二进制。

    代码见这里

    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    k8s各个组件使用过程中的纪要
    lynis安装与使用
    在docker容器中使用sudo命令
    CAD文字双击后移位
    Centos 7 上 源码安装和配置 ATS 9.1.2
    《编程之美》2.2 不要被阶乘吓倒
    《编程之美》2.1 求无符号整数N的二进制表示中1的个数
    达梦数据库体系学习分享
    使用grabit分析mysql数据库中的数据血缘关系
    C++ 赋值运算符和拷贝构造函数
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8156647.html
Copyright © 2020-2023  润新知