百练 2811:熄灯问题(枚举)

百练2811:熄灯问题(枚举、位运算) 总时间限制: 1000ms 内存限制: 65536kB描述有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。在上图中,左边矩阵中用 阅读详情

描述

有一个由按钮组成的矩阵,其中每行有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列的灯。

输入

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

思路:

这很明显是一个枚举的题目,但是如果你一个个的枚举,显然2^30次,时间会超时,所以我们需要找方法来减少枚举的次数。

那我们通过题目可以知道对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭第1行的全部灯。如此重复下去,可以熄灭第1、2、3、4行的全部灯。

通过这句话我们可以知道,根据第1行灯的开关情况可以得到第二行的按压状态,以此类推我们最后可以得到2-5行的按压状态。也就是说,由第一行的灯的开关情况,我们可以得到2-5行的按压状态。与此同时,第一行的按压状态又会对第一行的灯的开关情况产生影响。因为灯的初始状态不变,所以,最后影响2-5行的按压状态的因素就变成了第一行的按压状态。也就是说我们只需要找到第一行正确的按压状态便可以得到整个按压矩阵。此时枚举次数便降至2^6, 时间复杂度大大减小。

步骤:
  1. 确定一种第一行的按压状态(可以根据二进制加法来枚举)
  2. 根据第一行的按压状态和第一行的灯的开关情况,依次求出2-5行的按压状态
  3. 确定此情况下第五行的灯是否完全熄灭(因为由题目知,此时1-4应当全灭)
  4. 若第五行全灭,则此时的按压矩阵即为答案,否则接着重复上述过程,直到找到答案

话不多说(虽然有点多),,,上代码!!!

#include <stdio.h>
int button[10][10];/*记录按钮状态*/
int mp[10][10];/*记录灯的初始状态*/ 

bool guess()
{
	for(int i=2;i<=5;i++)//确认2-5行的按压状态 
	{
		for(int j=1;j<=6;j++)
		{
			button[i][j]=(mp[i-1][j]+button[i-1][j]+
			button[i-2][j]+button[i-1][j-1]+button[i-1][j+1])%2;
			//下一行的按压状态=(上一行的灯的状态+按压状态+灯的上、左、右的按压状态)%2;
			//%2是因为存在按压两次相互抵消 ,且考虑到灯的状态因别处的按压而改变的情况 
			//这里如果不明白,可以手推一下(万能手写) 
		}
	} 
	for(int i=1;i<=6;i++)//若按压矩阵正确,则第五行的按压状态应当与第五行灯的原始状态一样 
	{                   //因为只有一样,才能确保第五行的灯熄灭 
		if(button[5][i]!=(mp[5][i]+button[5][i-1]+button[4][i]+button[5][i+1])%2)
		return false;
	}
	return true;
}

void look()
{
	//for(int i=1;i<=6;i++) button[1][i]=0;/*令第一行的初始状态全为0*/没有也可以过(因为全局变量) 
	//这里用的是模拟二进制加法来表示第一行的变化,并根据此变化来进行枚举 
	int pos;
	while(guess()==false)
	{
		button[1][1]++;//从左边加,向右进位 
		pos=1;
		while(button[1][pos]>1)//这里如果不懂可以手写一下,弱弱我就经常这么干 
		{
			button[1][pos]=0;
			pos++;
			button[1][pos]++;
		} 
	} 
} 

int main( )
{
//	for(int i=0;i<8;i++) button[0][i]=0;  这里是给矩阵赋初值的,没有也能过, 
//	for(int i=1;i<6;i++) button[i][0]=0,button[i][7]=0;应该是因为全局变量默认为0吧
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=6;j++)
		{
			scanf("%d",&mp[i][j]);
		} 
	}
	look();/*寻找答案矩阵*/
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=6;j++)
		{
			if(j!=6) printf("%d ",button[i][j]);
			else printf("%d\n",button[i][j]);
		}
	}
	return 0;
}

最后,如果你还不明白,没关系,弱弱我再赠送大佬网址一个:
[http://blog.sina.com.cn/s/blog_7393daaf0100svoo.html]

OJ习题详解 1222: EXTENDED LIGHTS OUT,2811: 熄灯问题 C++算法 枚举 欢迎关注笔者,你的支持是持续更博的最大动力 目录问题描述思路枚举改进:枚举局部代码相关内容其他 问题描述 1222: EXTENDED LIGHTS OUT(点击可看详细描述) 中文版2811: 熄灯问题(点击可看中文描述) 简单来说,就是有一组5行6列的灯,每个灯有一个按钮,求一种按按钮方案,可使得所有灯都熄灭。 上图用矩阵表示如下: 要求输出结果:可以熄灭所有灯的按钮的方案。 思路 枚举 这道题可以用枚举的方法解题。刚看到这道题可能有点懵,所以先梳理一下: 最容易想到的应该是,把亮着的灯一. 阅读详情

相关推荐

枚举 熄灯问题

在上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。在下图中,第2行第3、5列的按钮都被按下,因此第2行、第4列的灯的状态就不改变。根据上面的规则,我们知道1)第2次按下同一个按钮时,将抵消第1次按下时所产生的结果。对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭第1行的全部灯。其中的1表示需要把对应的按钮按下,0则表示不需要按对应的按钮。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。同样,按下第1、2、3、4、5列的按钮,可以熄灭前5列的灯。

soilovedogs的博客 1152

POJ-2811:熄灯问题(按钮问题,枚举)

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

Rise 1518

[C++][枚举]熄灯问题

1.题目 2811:熄灯问题 查看 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按...

BRAVE_NO1的专栏 1756

poj 2811:熄灯问题

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

abc15766228491的博客 429

别再死记硬背了!用‘瞬时极性法’5分钟搞定三极管反馈电路类型判断

本文介绍了使用‘瞬时极性法’快速判断三极管反馈电路类型的高效技巧。通过假设输入信号变化并追踪传递路径,该方法能准确区分正负反馈、电压电流反馈、串联并联反馈及交直流反馈,避免传统死记硬背的弊端,显著提升电路分析效率。

weixin_42524708的博客 182

图自编码器(GAE)与变分图自编码器(VGAE)

在学习图自编码器之前先了解一下自编码器与变分自编码器。

小鱼的小窝 1万+

OpenJudge2811:熄灯问题(枚举)

枚举

qq_51480701的博客 412

在 PyCharm 中使用 Copilot

此外,要在 PyCharm 中使用 GitHub Copilot,您必须有效订阅 Copilot。在 PyCharm 中安装 GitHub Copilot 后,您现在可以将其用作项目的扩展。此外,它很容易安装在不同的 IDE 平台上,您还可以为特定编程语言启用 GitHub 插件。此外,按照以下步骤,您可以轻松地在 PyCharm 中安装 GitHub Copilot。此外,在 IDE 上使用 GitHub Copilot 时,您可以使用一些快捷方式。

一览无遗 1万+

百练 2811:熄灯问题【枚举】(题目分析 + 详细注释 + C++代码)

题目传送门 题意: 每个方格有一盏灯,有亮和灭两种状态 然后每个方格处也有一个按钮,按下这个按钮,会导致 当前方格和其上下左右的方格的灯的状态转变,即 亮 -> 灭,灭-> 亮 求按按钮的方式 分析: 题目中也说了,按按钮的顺序不影响最后的结果(这是显然的,不说也应该知道) 可能的做法有: 1. 每个按钮有按和不按两种情况,如果直接枚举的话,那就是O(2 ^ 30),显然吃不消 2. 既然没办法枚举所有的按钮,那么就要想办法排除掉一些无用的情况 ...

957

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

【QGIS】PyCharm集成pyqgis的processing工具箱:环境配置与初始化实战

本文详细介绍了如何在PyCharm中配置QGIS的Python环境并成功集成其强大的Processing工具箱。文章核心解决了独立环境下导入processing模块失败、算法无法调用等常见难题,通过手动添加插件路径和执行关键初始化步骤,实现了在PyCharm中丝滑调用QGIS地理处理算法,从而将复杂的空间分析流程自动化。

weixin_28831399的博客 391

2811 熄灯问题(枚举)

题目链接: http://bailian.openjudge.cn/practice/2811/ 描述 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变...

aisebu7819的博客 291

Seedance 2.5、HappyHorse 1.1与豆包Seed 2.1:一周内三大模型技术参数分析

音频生成延续原生音画同步架构,将文本、画面、音频统一序列建模,生成过程同步产出匹配口型的原声音频,支持中、英、日、韩、德、法、阿拉伯7种语言唇形对齐,无需二次调音。从行业趋势看,30秒直出、4K分辨率、7语种唇形同步正在成为视频生成的标配,编程Agent化和多模态理解正在成为语言模型的标配。技术狂奔的同时,监管在同步收紧。我理解这里的关键在于,视频生成模型的商业化落地不仅取决于生成质量,更取决于推理效率——生成一段15秒1080P视频需要多少秒、消耗多少算力,直接决定了模型的商用可行性。

lichunchuan1的博客 323

枚举--百练2811--熄灯问题

题目陈述 这道题乍一看不会做,但听完老师的思路就变得很简单: 虽然情况很多似乎列举不完,但是我们可以只列举第一行的所有情况,然后推出后面的所有情况,这下这道题就有了思路 我自己写的时候没有用到下面这两句代码(也即在完整代码中高亮标记的那两句) press[i+1][l]=(press[i-1][l]+press[i][l-1]+press[i][l]+press[i][l+1]+lig...

weixin_30326745的博客 136

Transformers 中的 Softmax 可以并行加速么?

通过融合前两个计算步骤,降低执行Reduce_max和Reduce_sum等操作的通信开销。利用共享内存来存储临时数据,以减少对全局内存的访问成本。

stephen147的博客 1234

Open3D 计算点云基本特征

在 Open3D 中,可以通过 PCA(主成分分析)来求得点云的特征值和特征向量。然后基于这些特征值,进一步计算各种几何特征,如线性、平面性、球度等。

纵马踏花向自由 1605

【算法-枚举】熄灯问题 通俗详细的解题叙述(OpenJudege-2811)

对于该问题的描述: https://www.bilibili.com/video/av10046345/?p=4 #p4熄灯问题 http://bailian.openjudge.cn/practice/2811/ #OpenJudege-2811

Monster的博客 4315

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Bailian2811 熄灯问题【暴力】

2811:熄灯问题 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。 在上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。对矩阵中的每盏灯设置一个初始状

海岛Blog 3065

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

百炼 2811:熄灯问题

2811:熄灯问题 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状...

haiki66的博客 711

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Openjudge 2811 熄灯问题 枚举 爆搜

爆搜

wjlwangluo的博客 673

POJ_2811(熄灯问题)

POJ_2811,熄灯问题,同画家问题(POJ_1681),通过二进制枚举第一行的情况后逐行操作,判断最后一行是否全亮 #include <iostream> #include <cstring> #include <cmath> using namespace std; int main(){ bool lights[7][8],copyl[7][8],an...

宫·商的博客 311

百练2811:熄灯问题

题目 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。 在上图...

Alex 715

熄灯问题(POJ 2811)

问题描述: Note: 1. int a[5][6] 输入循环如下,是不可以的,会一直无法结束输入,数组下标应是0~4,0~5 。 for(i = 1; i <= 5; i++) for(j = 1; j <= 6; j++) cin >> a[i][j]; 2 . 有一个由按钮组成的矩阵,其中每行有...

jiangjiangjiang6的博客 802

2811:熄灯问题

2811:熄灯问题 查看提交统计提示提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。 在上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。对矩阵中的

weixin_43368077的博客 302

熄灯问题(百练2811)

#include #include #include using namespace std; /* 解题思路: 给定房间灯光现状矩阵matrix,令操作矩阵press全取0; 不管第一行的灯光矩阵是怎么样的,第二行的press都有办法把第一行的灯光全部熄灭; 依次类推,第i行的press总有办法把第i-1行的灯光全部熄灭; 因此,只要第一行的press取值定下来,一定有办法让第1到第4

u010524510的博客 669
上一篇: 中石油 本材加工(多个数的最大公约数)
下一篇: Little Artemtime(思维)
Cosmic_Tree
博客等级 码龄7年 134粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值