`

1222(部分枚举)

阅读更多

1222:EXTENDED LIGHTS OUT

总时间限制:
1000ms
内存限制:
65536kB
描述
In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons each). Each button has a light. When a button is pressed, that button and each of its (up to four) neighbors above, below, right and left, has the state of its light reversed. (If on, the light is turned off; if off, the light is turned on.) Buttons in the corners change the state of 3 buttons; buttons on an edge change the state of 4 buttons and other buttons change the state of 5. For example, if the buttons marked X on the left below were to be pressed,the display would change to the image on the right.

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.
输入
The first line of the input is a positive integer n which is the number of puzzles that follow. Each puzzle will be five lines, each of which has six 0抯 or 1抯 separated by one or more spaces. A 0 indicates that the light is off, while a 1 indicates that the light is on initially.
输出
For each puzzle, the output consists of a line with the string: "PUZZLE #m", where m is the index of the puzzle in the input file. Following that line, is a puzzle-like display (in the same format as the input) . In this case, 1's indicate buttons that must be pressed to solve the puzzle, while 0抯 indicate buttons, which are not pressed. There should be exactly one space between each 0 or 1 in the output puzzle-like display.
样例输入
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
翻译:
 1.问题描述:有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。
在矩阵角上的按钮改变3盏灯的状态
在矩阵边上的按钮改变4盏灯的状态
其他的按钮改变5盏灯的状态
 
2.在上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变
对矩阵中的每盏灯设置一个初始状态。请你按按钮,直至每一盏等都熄灭。与一盏灯毗邻的多个按钮被按下时,一个操作会抵消另一次操作的结果。在下图中,第2行第3、5列的按钮都被按下,因此第2行、第4列的灯的状态就不改变
3.请你写一个程序,确定需要按下哪些按钮,恰好使得所有的灯都熄灭。根据上面的规则,我们知道
第2次按下同一个按钮时,将抵消第1次按下时所产生的结果。因此,每个按钮最多只需要按下一次。
各个按钮被按下的顺序对最终的结果没有影响
对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭第1行的全部灯。如此重复下去,可以熄灭第1、2、3、4行的全部灯。同样,按下第2、3、4、5、6列的按钮,可以熄灭前5列的灯。
 
解题思路:
 
1.经过观察,发现第1行就是这样的一个“局部”。因为第1行的各开关状态确定的情况下,这些开关作用过后,将导致第1行某些灯是亮的,某些灯是灭的。
此时要熄灭第1行某个亮着的灯(假设位于第i列),那么唯一的办法就是按下第2行第i列的开关(因为第一行的开关已经用过了,而第3行及其后的开关不会影响到第1行)。
 
2.为了使第1行的灯全部熄灭,第2行的合理开关状态就是唯一的。
第2行的开关起作用后,为了熄灭第二行的灯,第3行的合理开关状态就也是唯一的,以此类推,最后一行的开关状态也是唯一的。
 
3.总之,只要第1行的状态定下来,比如叫A,那么剩余行的情况就是确定唯一的了。推算出最后一行的开关状态,然后看看最后一行的开关起作用后,最后一行的所有灯是否都熄灭,如果是,那么A就是一个解的状态。如果不是,那么A不是解的状态,第1行换个状态重新试试。
因此,只需枚举第一行的状态,状态数是2的6次方= 64
 
具体实现:
1.
用一个矩阵a[5][6]表示灯的初始状态
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次方种可能取值
 
2.建立2个函数
第一个函数temp(),对b的第一行元素的每种取值进行枚举
在每种取值情况下,看看是否找到答案;若找到,则返回;若没有,则尝试下一种取值的情况
问题1:如何进行枚举?如果每行开关数目是N那怎么办?
第二个函数deal():对b的第一行的给定取值,根据熄灯规则计算出b的其他行的值,判断这个b能否使得矩阵第五行的所有灯也恰好熄灭。
3.计算出b的其他行的值
用一个68的数组来表示按钮矩阵:简化计算数组下一行的值的计算公式
第0行、第0列和第7列不属于b矩阵范围,可全置0
给定b的第一行取值,计算出b的其他行的值
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
 
 
解决代码:G++
 
#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 ;
}
 
分享到:
评论

相关推荐

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-master"显然是一个用于演示如何通过反射来操作枚举类的示例。 首先,让我们理解枚举类的基本概念。枚举类在Java中用于定义...

    java枚举实例代码

    Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...

    易语言枚举窗口易语言枚举窗口易语言枚举窗口

    易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载...

    易语言模拟枚举类型

    这可以通过在程序开始部分设置这些常量或变量的值来实现。 3. 使用枚举:在程序中,可以通过常量名或变量名直接使用这些模拟的枚举值。例如,`颜色_红色`可以作为函数的参数传递,或者与其它变量进行比较。 4. ...

    自定义控件(十)添加枚举型属性

    本文将详细讲解如何在Visual Studio 2008(VS2008)中创建自定义控件,并添加枚举型属性,以提高控件的灵活性和可配置性。 一、自定义控件基础 自定义控件是通过继承已有的服务器控件,或直接继承`System.Web.UI....

    spring boot 枚举使用的坑整理

    Spring Boot 枚举使用的坑整理 Spring Boot 枚举使用的坑整理是指在使用 Spring Boot 枚举时可能出现的一些问题和解决方法的总结。枚举类型是一种特殊的数据类型,它具有固定的值,且这些值不会被修改。在 Java 中...

    delphi枚举字符串转换

    在Delphi编程中,枚举(Enumeration)是一种强大的工具,用于定义一组相关的命名常量。枚举类型在处理固定集合的值时非常有用,而字符串转换则是编程中常见的操作,特别是在处理用户输入或数据交互时。当我们需要将...

    java枚举结果类、根据状态值获取枚举值

    java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” &lt;/#list&gt;

    枚举学习源代码

    枚举(Enum)在编程语言中是一种特殊的数据类型,它用于定义一组相关的常量。枚举可以帮助我们提高代码的可读性、维护性和安全性。在本主题“枚举学习源代码”中,我们将深入探讨枚举的概念、用法以及如何在实际项目...

    Java中的“枚举类型

    枚举不仅是Java语法的一部分,更是一种设计理念的体现。它鼓励开发者在设计程序时,明确区分不同类型的常量,并充分利用其类型安全性和封装能力。 #### 三、枚举与`static final`字段的比较 **1. 类型安全性** - ...

    java枚举类型说明

    ### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...

    Unity-C#-遍历枚举,通过枚举对象获取枚举类型.txt

    枚举参数与对象类型进行比较,判断是否属于同一类型

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    枚举类型.pptx

    ### 枚举类型详解 #### 一、枚举的基本概念与使用场景 枚举是一种特殊的类,用于封装一组固定的常量。它可以帮助我们更清晰地管理那些固定不变的数据,比如一年四季、一周七天等。枚举类型的使用,能够使程序更加...

    USB.zip_USB HUB _USB 枚举_usb_usb端口的枚举_枚举HUB

    总之,USB枚举是USB系统正常运行的关键部分,而USB Hub的枚举则增加了设备扩展性和管理的复杂性。理解这一过程对于开发、调试USB设备以及优化系统性能至关重要。通过深入学习和实践,我们可以更好地掌握USB技术,...

    mybatis入门实战之枚举类型

    本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了一个简单的demo,非常适合初学者了解并实践MyBatis的TypeHandler机制。 首先,我们要明白枚举...

    56个民族枚举类

    通常,开发者会创建这样的枚举来规范化程序中涉及民族分类的部分,避免使用字符串常量可能导致的错误和不一致性。通过使用枚举,我们可以确保程序只使用预定义的民族选项,提高了代码的可读性和可维护性。 从标签...

    枚举算法枚举算法枚举算法.ppt

    枚举算法枚举算法枚举算法.ppt

    枚举 USB HUB 设备

    在IT领域,枚举USB HUB设备是一项基础但至关重要的任务,它涉及到计算机硬件与操作系统之间的交互。USB(Universal Serial Bus)是一种通用串行总线标准,用于连接计算机系统和各种外设,如键盘、鼠标、打印机、扫描...

    枚举各类波形实例_枚举_数字波形_

    在电子工程和信号处理领域,数字波形是用于表示时间变化的数字数据序列,它们通常在计算机程序中以数组或枚举的形式存储。枚举(Enumeration)是编程语言中一种特殊的数据类型,它用于定义一组预定义的常量,每个...

Global site tag (gtag.js) - Google Analytics