熄灯问题

2023-11-19

有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯,当按下一个按钮后,该按钮以及周围位置(上,下,左,右)的等都会转变状态。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。

在上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。对矩阵中的每盏灯设置一个初始状态。请你按按钮,直至每一盏等都熄灭。与一盏灯毗邻的多个按钮被按下时,一个操作会抵消另一次操作的结果。在下图中,第2行第3、5列的按钮都被按下,因此第2行、第4列的灯的状态就不改变。

请你写一个程序,确定需要按下哪些按钮,恰好使得所有的灯都熄灭。根据上面的规则,我们知道1)第2次按下同一个按钮时,将抵消第1次按下时所产生的结果。因此,每个按钮最多只需要按下一次;2)各个按钮被按下的顺序对最终的结果没有影响;3)对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭第1行的全部灯。如此重复下去,可以熄灭第1、2、3、4行的全部灯。同样,按下第1、2、3、4、5列的按钮,可以熄灭前5列的灯。

代码如下:

#include<memory>
#include<string>
#include<cstring>
#include<iostream>
using namespace std ;
char orilights[5] ;
char  lights[5] ;
char result[5] ;

int GetBit(char c,int i)
{
    return (c >> i) & 1;
}
 void SetBit(char &c,int i,int v)
 {
    if(v){
        c |= ( 1 << i );
     }
     else c &= ~(1 << i);
 }
 void FlipBit(char & c,int i)
 {
    c ^= (1 << i);
 }
 void OutputResult(int t,char result[])
 {
    cout << "PUZZLE #" << t << endl;
    for(int i = 0;i < 5;i++){
        for(int j = 0;j < 6;j++){

            cout << GetBit(result[i],j);
            if(j < 5)
                cout << " ";
        }
        cout << endl;   
    }
}

int main()
{
    int T;
    cin >> T;
    for(int t = 1 ;t <= T;t++){
        for(int i = 0;i < 5;i++)
            for(int j = 0;j < 6;j++){
            int s;
            cin >> s;
            SetBit(orilights[i],j,s);
            }
        for(int n = 0;n < 64;++n){
            int switchs = n;
            memcpy(lights,orilights,sizeof(orilights));
            for(int i = 0;i < 5;i++){
                result[i] = switchs;
                for(int j = 0;j < 6;++j){
                    if( GetBit(switchs,j)){
                        if(j > 0)
                            FlipBit(lights[i],j-1);
                            FlipBit(lights[i],j);
                        if(j < 5)
                            FlipBit(lights[i],j+1);
                    }
                }
                if(i < 5)
                    lights[i+1] ^= switchs;
                switchs = lights[i];
            }
            if(lights[4] == 0){
                OutputResult(t,result);
                break;
            }       
        }
    }
    return 0;
}           
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

熄灯问题 的相关文章

随机推荐

  • HDLC原理及配置

    一 HDLC原理 HDLC是由国际标准化组织 ISO 制定的面向比特的同步数据链路层协议 主要用于封装同步串行链路上的数据 HDLC是在数据链路层中被广泛使用的协议之一 二 HDLC配置 AR1
  • 使用Qemu+gdb来调试内核

    原文地址 http blog csdn net iamljj article details 5655169 昨天听别人讲使用Qemu和gdb来实现源码级内核调试 今天试了一下 果然非常方便 现简单的记录一下 Qemu是一个开源的虚拟机软件
  • Unity --- Vector3类的API讲解

    1 Vector3中的静态变量是相对于世界坐标系的还是相对于自身坐标系呢 我们创建的Vector3类对象同理 答 这取决我们将创建的Vector3类对象 通过Vector3调用的静态变量传给了哪一个引用 如果是传给了positon的话 则该
  • 工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计

    鸿鹄工程项目管理系统 Spring Cloud Spring Boot Mybatis Vue ElementUI 前后端分离构建工程项目管理系统 1 项目背景 一 随着公司的快速发展 企业人员和经营规模不断壮大 为了提高工程管理效率 减轻
  • 14_Deep Computer Vision Using Convolutional Neural Networks_max pool_GridSpec_tf.nn, layers, contrib

    cp15 Classifying Images with Deep Convolutional NN Loss Cross Entropy ax text mnist CelebA Colab ckhttps blog csdn net L
  • socket连接超时问题

    一部分 把CSDN与中文yahoo翻了底朝天 也没找到如何设置socket的连接超时的满意方法 问此问题的兄弟已有一大堆 这里偶就讲一下win下如何设置socket的connect超时 设置connect的超时很简单 CSDN上也有人提到过
  • hive jdbc/metastore客户端方式连接开启kerberos的hive集群api

    pom依赖
  • Linux内核源代码情景分析-系统调用brk()

    首先看下进程地址空间示意图 我们简单的说 从低地址到高地址 代码区和数据区 空洞 堆栈区 在Linux内核源代码情景分析 内存管理之用户堆栈的扩展 我们申请了从堆栈区往下 数据区上面的页面 在Linux内核源代码情景分析 内存管理之用户页面
  • c语言getchar的作用,c=getchar()!='\n'到底什么用呢

    c getchar n 到底什么用呢 include
  • shell if多个条件判断_shell条件判断

    shell 开头 以sh后缀 开头 注释 表明采用何种解释器 bin bash lt 文件权限 ll total 4 rw r r 1 root root 88 Apr 24 22 15 demo sh 其中可以看到 demo sh没有可执
  • 微信小程序支付完整流程

    1 注册微信支付商户号 由上级或法人注册 注册链接 https pay weixin qq com index php apply applyment home guide normal none 此商户号 需要由主管及更上级领导进行注册
  • matlab计算基础

    目录 1 创建矩阵和向量 2 矩阵的基本运算 2 1 数乘 2 2 转秩 2 3 求逆 2 4 点积 2 5 拼接 3 复数 4 矩阵元素的引用 5 工作区中数据的保存和使用 1 创建矩阵和向量 向量包括行向量和列向量 向量就是个特殊的矩阵
  • 动态链接库-DLL探秘

    在Windows世界中 有无数块活动的大陆 它们都有一个共同的名字 动态链接库 在Windows世界中 有无数块活动的大陆 它们都有一个共同的名字 动态链接库 现在就让我们走进这些神奇的活动大陆 找出它们隐藏已久的秘密吧 初窥门径 Wind
  • Ceph入门到精通-Macvlan网络模式

    Docker中的Macvlan网络模式提供了一种将容器直接连接到宿主机网络的方式 使得容器可以拥有自己的MAC地址和与宿主机网络的直接连接 以下是使用Macvlan网络模式的一般步骤 创建Macvlan网络 docker network c
  • 通过uniapp打包生成的ipa安装包如何上架appstore

    通过uniapp打包生成的ipa安装包如何上架appstore 今天刚接手一个发布在android和ios平台的uniapp项目 因为我之前没有上线appstore平台的经验就专门了解了一下之前的上架流程 对于如何获取ios开发证书 发布证
  • 真正解决ScrollView嵌套RecyclerView的显示不全及滑动问题

    很多人都会遇到ScrollView嵌套RecyclerView嵌套的问题 各种嵌套模式 这种嵌套会出现以下几种问题 1 ScrollView和RecyclerView两者都会滑动 而且有时候 滑动会冲突 2 RecyclerView显示不全
  • 基于Bert的提示学习(prompt)文本分类

    1 介绍 1 1任务描述 1 2任务说明 2 建立模型 3 数据加载 4 训练 1 介绍 1 1任务描述 商品同款挖掘 同款商品是指商品的重要属性完全相同且客观可比的商品 商品同款识别的主要目的是从海量结构化和无结构化的商品图文数据库中匹配
  • 双模态情感分析

    1 任务介绍 2 建立模型 1 任务介绍 在做情感分析任务是 一般是通过纯文本进行判断的 或者通过语音来判断 现结合语音 文本双模态来进行情感分析 2 建立模型 from keras layers import from mult emti
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(未知)阴影映射

    未完成 黑近白远 oglmanager h ifndef OGLMANAGER H define OGLMANAGER H include
  • 熄灯问题

    有一个由按钮组成的矩阵 其中每行有6个按钮 共5行 每个按钮的位置上有一盏灯 当按下一个按钮后 该按钮以及周围位置 上 下 左 右 的等都会转变状态 即 如果灯原来是点亮的 就会被熄灭 如果灯原来是熄灭的 则会被点亮 在矩阵角上的按钮改变3