1222:EXTENDED LIGHTS OUT
The aim of the game is, starting from any initial set of lights on in the display, to press buttons to get the display to a state where all lights are off. When adjacent buttons are pressed, the action of one button can undo the effect of another. For instance, in the display below, pressing buttons marked X in the left display results in the right display.Note that the buttons in row 2 column 3 and row 2 column 5 both change the state of the button in row 2 column 4,so that, in the end, its state is unchanged.
Note:
1. It does not matter what order the buttons are pressed.
2. If a button is pressed a second time, it exactly cancels the effect of the first press, so no button ever need be pressed more than once.
3. As illustrated in the second diagram, all the lights in the first row may be turned off, by pressing the corresponding buttons in the second row. By repeating this process in each row, all the lights in the first
four rows may be turned out. Similarly, by pressing buttons in columns 2, 3 ?, all lights in the first 5 columns may be turned off.
Write a program to solve the puzzle.
2 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 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 0
PUZZLE #1 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 PUZZLE #2 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1
在矩阵角上的按钮改变3盏灯的状态
在矩阵边上的按钮改变4盏灯的状态
其他的按钮改变5盏灯的状态
对矩阵中的每盏灯设置一个初始状态。请你按按钮,直至每一盏等都熄灭。与一盏灯毗邻的多个按钮被按下时,一个操作会抵消另一次操作的结果。在下图中,第2行第3、5列的按钮都被按下,因此第2行、第4列的灯的状态就不改变
第2次按下同一个按钮时,将抵消第1次按下时所产生的结果。因此,每个按钮最多只需要按下一次。
各个按钮被按下的顺序对最终的结果没有影响
对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭第1行的全部灯。如此重复下去,可以熄灭第1、2、3、4行的全部灯。同样,按下第2、3、4、5、6列的按钮,可以熄灭前5列的灯。
此时要熄灭第1行某个亮着的灯(假设位于第i列),那么唯一的办法就是按下第2行第i列的开关(因为第一行的开关已经用过了,而第3行及其后的开关不会影响到第1行)。
第2行的开关起作用后,为了熄灭第二行的灯,第3行的合理开关状态就也是唯一的,以此类推,最后一行的开关状态也是唯一的。
因此,只需枚举第一行的状态,状态数是2的6次方= 64
a[i][j]=1:灯(i, j)初始时是被点亮的
a[i][j]=0:灯(i, j)初始时是熄灭的
用一个矩阵b[5][6]表示要计算的结果
b[i][j]=1:需要按下按钮(i, j)
b[i][j]=0:不需要按下按钮(i, j)
有下列等式成立(0<i<5, 0<j<6)
a[i][j]=(b[i][j-1]+b[i][j]+b[i][j+1]+ b[i-1][j]+b[i+1][j]) % 2
b[5][6]共有2的30次方种可能取值
在每种取值情况下,看看是否找到答案;若找到,则返回;若没有,则尝试下一种取值的情况
问题1:如何进行枚举?如果每行开关数目是N那怎么办?
第二个函数deal():对b的第一行的给定取值,根据熄灯规则计算出b的其他行的值,判断这个b能否使得矩阵第五行的所有灯也恰好熄灭。
第0行、第0列和第7列不属于b矩阵范围,可全置0
b[r+1][c]=(a[r][c]+b[r][c-1]+b[r][c]+b[r][c+1] + b[r-1][c])% 2
0<r<5, 0<c<7
#include<cstdio> using namespace std ; int a[6][8] ;//表示灯的初始状态 int b[6][8] ;//表示要计算的结果 /** 对a的第一行的给定取值, 根据熄灯规则计算出a的其他行的值, 判断这个a能否使得矩阵第五行的所有灯也恰好熄灭。 */ bool deal() { int c,r ; for(r=1;r<5;r++) for(c=1;c<7;c++) b[r+1][c]=(a[r][c]+b[r][c]+b[r][c-1]+b[r][c+1]+b[r-1][c])%2 ; for(c=1;c<7;c++) if((b[5][c-1]+b[5][c]+b[5][c+1]+b[4][c])%2!=a[5][c]) return false ; return true ; } void temp() { int c ; for(c=1;c<7;c++) b[1][c] = 0 ; while(deal()==false){ b[1][1]++; c=1 ; while(b[1][c]>1){ b[1][c] = 0 ; c++ ; b[1][c]++ ; } } return ; } int main() { int cases,i,r,c ; scanf("%d",&cases) ; for(r=0;r<6;r++) b[r][0] = b[r][7] = 0;//把第0列和第7列全部置0 for(c=1;c<7;c++) b[0][c] = 0 ; for(i=0;i<cases;i++){ for(r=1;r<6;r++)//行 for(c=1;c<7;c++)//列 scanf("%d",&a[r][c]); temp(); printf("PUZZLE #%d\n", i+1); for(r=1;r<6;r++){ for(c=1;c<7;c++) printf("%d ",b[r][c]); printf("\n"); } } return 0 ; }
相关推荐
枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-master"显然是一个用于演示如何通过反射来操作枚举类的示例。 首先,让我们理解枚举类的基本概念。枚举类在Java中用于定义...
Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...
易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载...
这可以通过在程序开始部分设置这些常量或变量的值来实现。 3. 使用枚举:在程序中,可以通过常量名或变量名直接使用这些模拟的枚举值。例如,`颜色_红色`可以作为函数的参数传递,或者与其它变量进行比较。 4. ...
本文将详细讲解如何在Visual Studio 2008(VS2008)中创建自定义控件,并添加枚举型属性,以提高控件的灵活性和可配置性。 一、自定义控件基础 自定义控件是通过继承已有的服务器控件,或直接继承`System.Web.UI....
Spring Boot 枚举使用的坑整理 Spring Boot 枚举使用的坑整理是指在使用 Spring Boot 枚举时可能出现的一些问题和解决方法的总结。枚举类型是一种特殊的数据类型,它具有固定的值,且这些值不会被修改。在 Java 中...
在Delphi编程中,枚举(Enumeration)是一种强大的工具,用于定义一组相关的命名常量。枚举类型在处理固定集合的值时非常有用,而字符串转换则是编程中常见的操作,特别是在处理用户输入或数据交互时。当我们需要将...
java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list>
枚举(Enum)在编程语言中是一种特殊的数据类型,它用于定义一组相关的常量。枚举可以帮助我们提高代码的可读性、维护性和安全性。在本主题“枚举学习源代码”中,我们将深入探讨枚举的概念、用法以及如何在实际项目...
枚举不仅是Java语法的一部分,更是一种设计理念的体现。它鼓励开发者在设计程序时,明确区分不同类型的常量,并充分利用其类型安全性和封装能力。 #### 三、枚举与`static final`字段的比较 **1. 类型安全性** - ...
### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...
枚举参数与对象类型进行比较,判断是否属于同一类型
Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...
### 枚举类型详解 #### 一、枚举的基本概念与使用场景 枚举是一种特殊的类,用于封装一组固定的常量。它可以帮助我们更清晰地管理那些固定不变的数据,比如一年四季、一周七天等。枚举类型的使用,能够使程序更加...
总之,USB枚举是USB系统正常运行的关键部分,而USB Hub的枚举则增加了设备扩展性和管理的复杂性。理解这一过程对于开发、调试USB设备以及优化系统性能至关重要。通过深入学习和实践,我们可以更好地掌握USB技术,...
本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了一个简单的demo,非常适合初学者了解并实践MyBatis的TypeHandler机制。 首先,我们要明白枚举...
通常,开发者会创建这样的枚举来规范化程序中涉及民族分类的部分,避免使用字符串常量可能导致的错误和不一致性。通过使用枚举,我们可以确保程序只使用预定义的民族选项,提高了代码的可读性和可维护性。 从标签...
枚举算法枚举算法枚举算法.ppt
在IT领域,枚举USB HUB设备是一项基础但至关重要的任务,它涉及到计算机硬件与操作系统之间的交互。USB(Universal Serial Bus)是一种通用串行总线标准,用于连接计算机系统和各种外设,如键盘、鼠标、打印机、扫描...
在电子工程和信号处理领域,数字波形是用于表示时间变化的数字数据序列,它们通常在计算机程序中以数组或枚举的形式存储。枚举(Enumeration)是编程语言中一种特殊的数据类型,它用于定义一组预定义的常量,每个...