熄灯问题

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

输入

5行组成,每一行包括6个数字(0或1)。相邻两个数字之间用单个空格隔开。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。

输出

5行组成,每一行包括6个数字(0或1)。相邻两个数字之间用单个空格隔开。其中的1表示需要把对应的按钮按下,0则表示不需要按对应的按钮。

样例输入

0 1 1 0 1 0

1 0 0 1 1 1

0 0 1 0 0 1

1 0 0 1 0 1

0 1 1 1 0 0

样例输出

1 0 1 0 0 1

1 1 0 1 0 1

0 0 1 0 1 1

1 0 0 1 0 0

0 1 0 0 0 0

大致思路

枚举第一行的操作,在每个的下一行全部将上一行的没有关闭的灯熄灭,最后根据最后一行的灯的状态来判断是否完成。

//定义两个数组分别记录初始状态和操作
//定义函数判断当前位置经过各种操作后的灯的状态
//枚举第一行的所有情况
//每一行都将上一行未熄灭或者点亮的灯熄灭
//操作完成后判断最后一行是否全部熄灭,若没有则继续枚举

题解代码

#include<bits/stdc++.h>
using namespace std; int arr[10][10];
int op[10][10]; int getState(int x, int y)
{
return (arr[x][y] + op[x][y] + op[x+1][y] + op[x-1][y] + op[x][y+1] + op[x][y-1]) & 1;
} void print()
{
//输出最终的操作矩阵
for(int i = 1; i <= 5; i++){
for(int j = 1; j <= 6; j++){
cout << op[i][j] << ' ';
//cout << getState(i, j) << ' ';
}
cout << endl;
}
} bool check()
{
//检查最后一行是否为全0
for(int i = 1; i <=6; i++){
if(getState(5, i) == 1) return false;
}
return true;
} bool findFirst(int n)
{
//对第一行进行操作并对后续行完成后续操作
int cnt = 1;
while(n){
op[1][cnt] = n & 1;
n >>= 1;
cnt++;
}
for(int i = 2; i <= 5; i++){
for(int j = 1; j <= 6; j++){
if(getState(i-1, j) == 1) op[i][j] = 1;
else op[i][j] = 0;
}
}
/*print();
cout << "----------\n";*/ return check();
} int main(){
memset(arr, 0, sizeof arr); for(int i = 1; i <= 5; i++){
for(int j = 1; j <= 6; j++){
cin >> arr[i][j];
}
} for(int i = 0; i < 64; i++){// 总共有6列灯,2^6种情况
memset(op, 0, sizeof op);
if(findFirst(i)){
print();
break;
}
} return 0;
}

OpenJudge2811:熄灯问题(枚举)的更多相关文章

  1. POJ1222熄灯问题【位运算+枚举】

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14231   Accepted: 8 ...

  2. ACM/ICPC 之 枚举(POJ1681-画家问题+POJ1166-拨钟问题+POJ1054-讨厌的青蛙)

    POJ1681-画家问题 枚举的经典例题,枚举第一行即可,其余行唯一. //画家问题,y表示黄色,w表示白色,怎样让墙上所有方格为y,操作类似熄灯问题poj1222 //memory 136K Tim ...

  3. 熄灯问题 --POJ 2811-ACM

    问题描述 盏灯的状态. 列的灯的状态就不改变. 请你写一个程序,确定需要按下哪些按钮,恰好使得所有的灯都熄灭.根据上面的规则,我们知道: 次按下时所产生的结果.因此,每个按钮最多只需要按下一次: (2 ...

  4. Swift enum(枚举)使用范例

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  5. 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

    建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...

  6. Objective-C枚举的几种定义方式与使用

    假设我们需要表示网络连接状态,可以用下列枚举表示: enum CSConnectionState { CSConnectionStateDisconnected, CSConnectionStateC ...

  7. Help Hanzo (素数筛+区间枚举)

    Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000).     (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼 ...

  8. 枚举:enum

    枚举 所谓枚举就是指定好取值范围,所有内容只能从指定范围取得. 例如,想定义一个color类,他只能有RED,GREEN,BLUE三种植. 使用简单类完成颜色固定取值问题. 1,就是说,一个类只能完成 ...

  9. .NET 基础一步步一幕幕[方法、结构、枚举]

    方法.结构.枚举 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值,写void 方法名:P ...

  10. Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件

    在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <su ...

随机推荐

  1. TinyMapper使用 对象映射框架

    方便的进行对象转换,仅作使用笔记 https://www.cnblogs.com/arvinzhang/p/8282922.html 例子: var result = new List<Equi ...

  2. Vue基础(2)双向绑定

    双向数据绑定 通过修改标签,例:切换radio.checkbox......都会对绑定的数据有影响 通过事件触发方法,修改data中数据,反向作用于radio.checkbox...... 1.v-m ...

  3. Mac如何卸载软件 Mac如何删除软件

    初次接触Mac苹果电脑的用户可能不知道如何卸载已经装好的应用软件,之前有给大家介绍Mac如何安装软件,现在教大家如何卸载软件,其实非常简单,让我们看看吧: 1.首先我们打开Finder,就是我们Doc ...

  4. ubuntu20关机慢: A stop job is running for Snappy daemon

    Ubuntu  20 关机超时 问题 A stop job is running for Snappy daemon [1 min 30s ] 解决办法 1.修改以下配置文件超时时间,如下: sudo ...

  5. rabbitmq 使用管理页面向队列中推送消息

    参考:https://blog.csdn.net/weixin_43343423/article/details/103382661

  6. Brupsuite 中插件CO2的使用

    ##0x00 CO2是Burpsuite的一个插件,使用这个插件让我们可以在Burp上使用SQLmap. ##0X01:CO2安装: Burp上的Extender下的BApp Store是Burp的应 ...

  7. Ubunutu的apt-get软件下载工具的国内镜像源

    Ubunutu安装时,默认没有给apt-get配置国内镜像源,其默认配置的镜像源国内不能访问到,安装软件处处失败,所以我们需要配置国内镜像源: 首先避免出错,我们先备份原sources.list文件, ...

  8. wpBullet-20190604

    WordPress Plugins/Themes 和 PHP 的静态代码分析工具 Usage: wpbullet.py [-h] [--path PATH] [--enabled ENABLED] [ ...

  9. DCS-WORLD 数据获取

    任务: 获取DCS-World的姿态数据,发送到6自由度平台. 过程: 1.获取dcs-bios https://github.com/DCSFlightpanels/dcs-bios 2.复制DCS ...

  10. 1903021126 申文骏 Java 第二周作业 代码编写及运行

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 Java第二周作业 博客名称 1903021126 申文骏 Java 第二周作业 代码编写及运行 要求 每道题要有题目,代码(使用插入代 ...