USTCOJ 1240 黑屋 非位运算版
USTCOJ 1240,黑屋:http://acm.ustc.edu.cn/ustcoj/problem.php?id=1240
该题采用暴力枚举的方式求出关灯所需的最少步数。其中press数组标记了了在每一次尝试关闭所有灯时需要按下的按钮。
程序将原有的2^(m*n)中可能的按按钮操作缩减为了2^m次方种按按钮操作。大大缩减了搜索空间。对于每一种按按钮操作,均调用turnOffLight函数尝试关灯,若关灯成功,返回true,不能将所有等关闭,则返回false。turnOffLight函数执行完后,可通过press数组读取本次关灯所需按下的按钮。
该解法的加速增强版请参考:http://blog.csdn.net/l03071344/article/details/8816508
/***********
*原作者:liujianhua
*修改注释:lance
***********/
#include <cstdio>
#include <cstring>
#define MAXLEN 100
#define MAXWID 15//数组开大一些,省去边界判断
int puzzle[MAXLEN + 5][MAXWID + 5];
char press[MAXLEN + 5][MAXWID + 5];
int n, m;bool turnOffLight()
{int c, r;for(r = 1; r < n; ++r){for(c = 1; c < m + 1; ++c)press[r + 1][c] = (puzzle[r][c] + press[r][c] + press[r - 1][c] + press[r][c - 1] + press[r][c + 1]) % 2;}for(c = 1; c < m + 1; ++c){if((press[n][c - 1] + press[n][c] + press[n][c + 1] + press[n - 1][c]) % 2 != puzzle[n][c])return false;}return true;
}//将计数部分剥离为一个函数
int count_step()
{int r, c, sum = 0;for(r = 1; r <= n; r++){for(c = 1; c <= m; ++c){if(press[r][c] == 1)++sum;}}return sum;
}int enumate()
{int minsteps = -1;int c = 0;while (1){//每次while循环guess函数总会执行//从press[1]全0开始,即从不管第一行任何灯开始if (turnOffLight()){int step = count_step();if (minsteps == -1 || minsteps > step)minsteps = step;}//对press[1]数组进行二进制加法,枚举所有可能的关灯方式press[1][1]++;c = 1;while (press[1][c] > 1){press[1][c++] = 0;press[1][c]++; //进位}//通过判断进位是否已经到c,来确定是否已经枚举完2^m种可能if (c == m + 1)break;}return minsteps;
}main()
{freopen("1240.in", "r", stdin);freopen("1240.out", "w", stdout);while((scanf("%d %d", &n, &m)) != EOF){//需要对press数组初始化,清除上一轮对press数组的设置memset(&press[0][0], 0, (n + 1) * (m + 1)); int i, j;for(i = 1; i <= n; ++i){for(j = 1; j <= m; ++j){scanf("%d", &puzzle[i][j]);if(puzzle[i][j] == 1)puzzle[i][j] = 0;else if(puzzle[i][j] == 0)puzzle[i][j] = 1;}}//枚举所有可能的开灯方式,返回可能的最小步数int sum = enumate();if (sum == -1)printf("no solution\n");elseprintf("%d\n", sum);}return 0;
}
USTCOJ 1240 黑屋 非位运算版相关推荐
- n皇后 - 位运算版
n皇后问题是大家在递归里会碰到的一个经典问题.以前高中我学DFS的时候,老师首先让我看的就是八皇后. 不过这皇后的时间复杂度大家可想而知了.而接下来的位运算将这个效率重新提到一个高度. 我是以前在Ma ...
- usaco Section 1.5 Checker Challenge 最慢0.162秒0.0+n皇后问题位运算版(C语言)
今天做USACO做到Section 1.5的Checker Challenge 直接dfs之后的结果是,超时.. 百度查查才想起来就是八皇后问题.有人讲怎么利用对称性怎么怎么优化,我没仔细看 直到看到 ...
- python与或非位运算_python位运算
什么是位运算 位运算就是把数字当成二进制来进行计算,位运算有六种:&(与), |(或), ^(异或), ~(非), <>(右移) &(与) &运算规则:两个位都为1 ...
- C语言与或非位运算 Java判断中 if条件
#include <stdio.h> int main(void) { char c1=92; char c2=92; printf("%d",c1|c2); prin ...
- USTCOJ1240 黑屋 位运算
USTCOJ 1240,黑屋:http://acm.ustc.edu.cn/ustcoj/problem.php?id=1240 该题采用暴力枚举的方式,通过位运算加速开关灯操作. 若理解有困难,可移 ...
- c语言位运算+乘法,关于c语言中的位运算。。。
标签:c++ 位运算是一种针对二进制数的一种运算 位运算 共有六种 都有其对应得操作符号 & (and) 位于 | (or) 位或 ~ ...
- 位运算(转自matrix67)
http://www.matrix67.com/blog/archives/263 (原文链接) 什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内 ...
- python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...
问题引入 在小强学Python+OpenCV之-1.4.2裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁剪. 那么,如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩 ...
- 单片机c语言或运算,单片机avr c语言位运算 与或非 异或逻辑 运算介绍 详解
位运算是指按二进制位进行的运算.在单片机中位运算通常用于I/O端口的输入输出控制和逻辑判断. C语言提供的位运算符有: 运算符 含义 功能 & 按位与 如果两个相应的二进制位都为1,则该位的结 ...
最新文章
- Win10+Python3.6下Pytorch安装(基于conda或pip)
- (邓爱萍)继承 课本
- php中可以实现多态的是继承,PHP设计模式通过继承实现多态
- Linux Increase The Maximum Number Of Open Files / File Descriptors (FD)
- 抓娃娃机爪不动怎么办_黄子韬吃娃娃菜能把临时牙咬断?种植牙到底结实不结实?...
- 重庆火锅哪家强,Python 帮你探探店
- 解压deb_Linux填坑记:很全面的解压和压缩命令集合
- 2017/09/15
- 【java学习之路】(javaWeb【后端】篇)003.RequestResponse
- Ros代码迁移,编译头文件报错解决办法
- hibernate之6.one2many单向
- HDU 2674 N!Again
- [GIS教程] 6 空间数据采集与处理-GIS数据源分类及其特征、采集与处理的基本流程、4D产品
- 曾宪武《物联网通信技术》课后答案(三)
- 国内常用的5个中文期刊论文网站,5个外文文献网站
- Labview 气体/温度检测系统
- SpringbootJPA分页 PageRequest过时
- 手机html保存工具,用手机保存任何网页视频:Pro Recorder 使用介绍
- safari浏览网页打开速度很慢如何解决
- 成长中的SEO,应该避免这12个过时的优化策略(转载自:https://www.duiji.net)
热门文章
- android在线预览excel文件格式,Android打开doc、xlsx、ppt等office文档解决方案
- 算法概念【PPT整理】
- Use Octavia to Implement HTTPS Health Monitors (by quqi99)
- 查找数组中重复数字并输出
- 阿里李睿博谈自己的折腾路:整个过程爱最重要
- 定义一个字典——Dictionary
- linux 共享文件夹 安装,linux – Vagrant并在共享文件夹中安装包
- 以python自定义模块的方式共享API(数据,短信通知、邮件通知,代理等)
- 2018美国大学计算机科学,2018usnews美国大学设计研究生计算机科学专业排名
- linux(centos)服务器时间校正