[笔记][中国大学mooc][程序设计与算法(二) 算法基础][枚举][局部枚举法] POJ1222 熄灯问题

本文主要是介绍[笔记][中国大学mooc][程序设计与算法(二) 算法基础][枚举][局部枚举法] POJ1222 熄灯问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

在这里插入图片描述

分析

按照一般的穷举法,一共有30个开关,所以解空间有 2 30 2^{30} 230个可能,需要减少枚举数目:

如果存在某个局部,一旦这个局部的状态被确定,那么剩余其他部分的状态只能是确定的一种,或者不多的n种,那么就只需枚举这个局部的状态即可

对于本题目,第一行开关按下的状态可以决定剩余所有的状态,将解空间大小缩小为 2 5 2^{5} 25
在这里插入图片描述

代码

#include <stdio.h>
int solve(char puzzle[][6], char result[][6]){int cnt1, cnt2;for(cnt1 = 1; cnt1 < 5; cnt1++){for(cnt2 = 0; cnt2 < 6; cnt2++){if(puzzle[cnt1 - 1][cnt2] == 1){result[cnt1][cnt2] = 1;puzzle[cnt1 - 1][cnt2] = !puzzle[cnt1 - 1][cnt2];puzzle[cnt1][cnt2] = !puzzle[cnt1][cnt2];if(cnt1+1 < 5) puzzle[cnt1+1][cnt2] = !puzzle[cnt1+1][cnt2];if(cnt2-1 >= 0) puzzle[cnt1][cnt2-1] = !puzzle[cnt1][cnt2-1];if(cnt2+1 < 6) puzzle[cnt1][cnt2+1] = !puzzle[cnt1][cnt2+1];}else result[cnt1][cnt2] = 0;}}for(cnt2 = 0; cnt2 < 6; cnt2++) if(puzzle[4][cnt2] != 0) return 0;return 1;
}
int main(){int puzzleNumber;char puzzle[5][6];char puzzleTemp[5][6];char result[5][6];int cnt, cnt1, cnt2, cnt3, tmp;scanf("%d", &puzzleNumber);for(cnt = 0; cnt < puzzleNumber; cnt++){for(cnt1 = 0; cnt1 < 5; cnt1++)for(cnt2 = 0; cnt2 < 6; cnt2++)scanf("%d", &puzzle[cnt1][cnt2]);printf("PUZZLE #%d\n", cnt+1);//枚举,从00000到11111for(cnt3 = 0; cnt3 < 64; cnt3++){tmp = cnt3;//将枚举元分解为第一行的操作for(cnt2 = 0; cnt2 < 6; cnt2++){result[0][cnt2] = tmp % 2;tmp /= 2;}//模拟对象初始化for(cnt1 = 0; cnt1 < 5; cnt1++)for(cnt2 = 0; cnt2 < 6; cnt2++)puzzleTemp[cnt1][cnt2] = puzzle[cnt1][cnt2];//执行第一行操作for(cnt2 = 0; cnt2 < 6; cnt2++){if(result[0][cnt2] == 1){puzzleTemp[0][cnt2] = !puzzleTemp[0][cnt2];puzzleTemp[1][cnt2] = !puzzleTemp[1][cnt2];if(cnt2-1 >= 0) puzzleTemp[0][cnt2-1] = !puzzleTemp[0][cnt2-1];if(cnt2+1 < 6) puzzleTemp[0][cnt2+1] = !puzzleTemp[0][cnt2+1];}}//执行接下来几行的操作,观察是否可以熄灭所有灯if(solve(puzzleTemp, result))for(cnt1 = 0; cnt1 < 5; cnt1++)printf("%d %d %d %d %d %d\n", result[cnt1][0], result[cnt1][1], result[cnt1][2], result[cnt1][3], result[cnt1][4], result[cnt1][5]);}}return 0;
} 

这篇关于[笔记][中国大学mooc][程序设计与算法(二) 算法基础][枚举][局部枚举法] POJ1222 熄灯问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/953606

相关文章

关于redis一些问题记录

问题一:启动redis时出现警告,使用下列命令(已解决)       问题二:启动时,需要解决的警告(未解决)       问题三:使用自己的配置文件启动redis时,可能会遇到: Could not connect to Redis at 127.0.0.1:6379: Connection refused 原因:6379 没有断开,使用“exit”后,重新使用redis-c

selenium +java 多个类公用driver问题

问题点:太久没有写selenium代码,居然把driver公用的问题忘记了,即:每写一个测试类,执行过程中都会新建一个窗口,这样应该说是非常不专业的。 大概想了一个方法,虽然看起来也不怎么专业,但感觉能用就很开心了。 解决步骤:                1 创建一个获取获取driver的方法getDriver()                2 创建成员变量,将 getDriver()赋值

mybaits基础增删改查-------mybatis(四)

Mybatis的增删改查 mybatis流程: 1 创建实体类及接口方法 2 创建全局配置文件 configuration.xml 3 创建 sql 映射文件 BlogMapper.xml 4 将全局文件中维护 sql映射文件配置 5 调用java API 执行相关sql操作 注意sqlSession是线程非安全的 实体java类: package model;public class Blo

sort常用排序模式---------shell基础篇(三)

sort 排序命令使用 表达式意义sort -c test测试文件“test”是否已经经过排序,一般用处不大sort -k1 test.txt按照第1域对文件test.txt进行排序,日常可以用来对合并的日志文件进行时间排序sort -k1 -m log1.txt log2.txt按照第一域进行排序后合并输出到控制台,建议使用“>>” 将合并内容输出到另一个文件中sort -t / -k3 te

threejs坑记录-笔记

雪花 注意depthTest: false 否则会出现有transparent无效 const createSnow = () => {let map = new THREE.TextureLoader().load(snow);let material = new THREE.SpriteMaterial({map: map,transparent: true,side: THREE.Dou

关于新版adt22.6.0的相关问题(自己总结)

首先说自己手贱的很,一不小心就更新了adt,导致现在各种问题频出。在网上找到了解决方案  在百度经验《 关于新版ADT创建项目时出现appcompat_v7的问题》!!!这个教程会告诉我们把appcompat_v7作为一个库项目,只有它点击 isLibrary,而你的项目千万不要点击islibrary,否则会在导出的时候出现There is no android project named xx

算法的设计方式

1.贪心算法 贪心算法(又称贪婪算法)是指在对问题求解时,从问题的某一个初始解出发,总是做出在当前看来最好的选择,当达到某算法中的某一步不能再继续前进时,算法停止。这时,就得到了问题的一个解,但不能保证求得的最后解是最优的。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题能产生整体最优解或者是整体最优解

冒泡算法及改进(属于交换排序)

冒泡排序(Bubble Sort)是一种交换排序,快速排序也属于一种交换排序。冒泡排序的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 假设一共共有 n 个数,则会进行 (n-1)趟比较,由1,2......n-1这么多趟,第一趟进行 (n-1)次比较,.......第n-1趟进行1次比较,故有公式:第i趟 +  第i趟的比较次数 = n       时间复杂度为

Linux删除大文件rm -rf的问题

请几天,我删除系统汇总的大文件,大约100G左右,当我使用rm -rf  xxxx.log删除后,使用df -h发现空间并未释放。 一开始以为是由于磁盘虚拟挂载,导致我删除的文件并不是当前目录的文件。但后来发现并不是。 我在网络上搜索发现都是  要: lsof | grep delete kill -9 xxx 但是我觉得这样不安全。 比如文件被进程锁定,或者有进程一直在向这个文件写数

剑指Offer面试题34题:丑数(Ugly Number)(while循环里面的三个小问题)

语言:C/C++语言 IDE:    Mac/Xcode  丑数:我们把只包含因子2、3、5的数称为丑数(Ugly Number),求按照从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯我们把1当做第一个丑数。 分析:所谓一个数m是另一个数n的因子,是指n%m==0。根据丑数的定义,丑数能被2,3,5整除,也就是一个数能连续的被2整除,或者连续的被3整