2019-03-21 [蓝桥杯][算法提高VIP]开灯游戏

题目描述
有9盏灯与9个开关,编号都是1~9。

每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的)。

具体如下:

第一个开关控制第二,第四盏灯;

第二个开关控制第一,第三,第五盏灯;

第三个开关控制第二,第六盏灯;

第四个开关控制第一,第五,第七盏灯;

第五个开关控制第二,第四,第六,第八盏灯;

第六个开关控制第三,第五,第九盏灯;

第七个开关控制第四,第八盏灯;

第八个开关控制第五,第七,第九盏灯;

第九个开关控制第六,第八盏灯。

开始时所有灯都是熄灭的,开关是关闭着的。要求按下若干开关后,使得只有4盏灯亮着。
输入

输出
输出所有可能的方案,每行一个方案,每一行有9个字符,从左往右第i个字符表示第i个开关的状态(" 0" 表示关闭," 1" 表示打开),按字典序输出。下面的样例输出只是部分方案。
样例输入

样例输出
000001011
000001110
000001111
提示
C语言在线学习平台微信号dotcpp
来源
算法提高

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
int m[10],light[10];
int a[10][10];
vector<int>res;

int main(void)
{ 
    a[1][0]=2; a[1][1]=2,a[1][2]=4;
    a[2][0]=3; a[2][1]=1,a[2][2]=3,a[2][3]=5;
    a[3][0]=2; a[3][1]=2,a[3][2]=6;
    a[4][0]=3; a[4][1]=1,a[4][2]=5,a[4][3]=7;
    a[5][0]=4; a[5][1]=2,a[5][2]=4,a[5][3]=6,a[5][4]=8;
    a[6][0]=3; a[6][1]=3,a[6][2]=5,a[6][3]=9;
    a[7][0]=2; a[7][1]=4,a[7][2]=8;
    a[8][0]=3; a[8][1]=5,a[8][2]=7,a[8][3]=9;
    a[9][0]=2; a[9][1]=6,a[9][2]=8;
    for(int status=1;status<=(1<<9)-1;status++)
    {
        memset(m,0,sizeof(m));
        memset(light,0,sizeof(light));
        int b=1;
        for(int i=1;i<=9;i++)
        {
            //处理开灯的情况 
            if(status&b) m[9-i+1]=1;
            b*=2;
        } 
        /*
        for(int i=1;i<=9;i++)
        {
            cout<<m[i];
        }
        cout<<endl;
        */
        //根据规则处理灯 
        for(int i=1;i<=9;i++)
        {
            if(m[i])
            {
                for(int k=1;k<=a[i][0];k++)
                {
                    int idx=a[i][k];
                    light[idx]=1-light[idx];    
                }
            }
        }
        int sum=0;
        for(int i=1;i<=9;i++) sum+=light[i];
        if(sum==4) res.push_back(status); 
    }
    for(int i=0;i<res.size();i++)
    {
        int status=res[i];
        //cout<<status<<endl;
        memset(m,0,sizeof(m)); 
        int b=1;
        for(int k=1;k<=9;k++)
        {
            //处理开灯的情况 
            if(status&b) m[9-k+1]=1;
            b*=2;
        }
        for(int k=1;k<=9;k++) cout<<m[k];
        if(i+1!=res.size())  cout<<endl;
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 小青,你想吃什么呢 小青说,吃…烤肉吧 我心想,啊,真不愧是我喜欢的女孩子。 然后我们开车去了一家我常去的韩国烤肉...
    小荼吉尼天阅读 1,828评论 0 0
  • 360云盘出事了 这下子没地方存东西了 那么多资料 果然让小伙伴不幸言中了 他说云盘不安全 要是哪天挂了,数据就全...
    JENY_f22c阅读 1,144评论 0 1
  • 一.Ubuntu/Linux Mint 系统+已经安装搜狗输入法 二.复制以下代码,并新建文件sublime_im...
    活腿肠阅读 5,123评论 0 1
  • 原来,小时候的过年和长大后的过年是不一样的,所以,很多人都会挂在嘴边一句话,年味淡了,现在哪里还有过年的样子。 而...
    一页欢喜阅读 4,121评论 2 10

友情链接更多精彩内容