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 黑屋 非位运算版相关推荐

  1. n皇后 - 位运算版

    n皇后问题是大家在递归里会碰到的一个经典问题.以前高中我学DFS的时候,老师首先让我看的就是八皇后. 不过这皇后的时间复杂度大家可想而知了.而接下来的位运算将这个效率重新提到一个高度. 我是以前在Ma ...

  2. usaco Section 1.5 Checker Challenge 最慢0.162秒0.0+n皇后问题位运算版(C语言)

    今天做USACO做到Section 1.5的Checker Challenge 直接dfs之后的结果是,超时.. 百度查查才想起来就是八皇后问题.有人讲怎么利用对称性怎么怎么优化,我没仔细看 直到看到 ...

  3. python与或非位运算_python位运算

    什么是位运算 位运算就是把数字当成二进制来进行计算,位运算有六种:&(与), |(或), ^(异或), ~(非), <>(右移) &(与) &运算规则:两个位都为1 ...

  4. C语言与或非位运算 Java判断中 if条件

    #include <stdio.h> int main(void) { char c1=92; char c2=92; printf("%d",c1|c2); prin ...

  5. USTCOJ1240 黑屋 位运算

    USTCOJ 1240,黑屋:http://acm.ustc.edu.cn/ustcoj/problem.php?id=1240 该题采用暴力枚举的方式,通过位运算加速开关灯操作. 若理解有困难,可移 ...

  6. c语言位运算+乘法,关于c语言中的位运算。。。

    标签:c++ 位运算是一种针对二进制数的一种运算 位运算 共有六种 都有其对应得操作符号 &      (and)      位于 |        (or)         位或 ~     ...

  7. 位运算(转自matrix67)

    http://www.matrix67.com/blog/archives/263 (原文链接) 什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内 ...

  8. python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...

    问题引入 在小强学Python+OpenCV之-1.4.2裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁剪. 那么,如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩 ...

  9. 单片机c语言或运算,单片机avr c语言位运算 与或非 异或逻辑 运算介绍 详解

    位运算是指按二进制位进行的运算.在单片机中位运算通常用于I/O端口的输入输出控制和逻辑判断. C语言提供的位运算符有: 运算符 含义 功能 & 按位与 如果两个相应的二进制位都为1,则该位的结 ...

最新文章

  1. Win10+Python3.6下Pytorch安装(基于conda或pip)
  2. (邓爱萍)继承 课本
  3. php中可以实现多态的是继承,PHP设计模式通过继承实现多态
  4. Linux Increase The Maximum Number Of Open Files / File Descriptors (FD)
  5. 抓娃娃机爪不动怎么办_黄子韬吃娃娃菜能把临时牙咬断?种植牙到底结实不结实?...
  6. 重庆火锅哪家强,Python 帮你探探店
  7. 解压deb_Linux填坑记:很全面的解压和压缩命令集合
  8. 2017/09/15
  9. 【java学习之路】(javaWeb【后端】篇)003.RequestResponse
  10. Ros代码迁移,编译头文件报错解决办法
  11. hibernate之6.one2many单向
  12. HDU 2674 N!Again
  13. [GIS教程] 6 空间数据采集与处理-GIS数据源分类及其特征、采集与处理的基本流程、4D产品
  14. 曾宪武《物联网通信技术》课后答案(三)
  15. 国内常用的5个中文期刊论文网站,5个外文文献网站
  16. Labview 气体/温度检测系统
  17. SpringbootJPA分页 PageRequest过时
  18. 手机html保存工具,用手机保存任何网页视频:Pro Recorder 使用介绍
  19. safari浏览网页打开速度很慢如何解决
  20. 成长中的SEO,应该避免这12个过时的优化策略(转载自:https://www.duiji.net)

热门文章

  1. android在线预览excel文件格式,Android打开doc、xlsx、ppt等office文档解决方案
  2. 算法概念【PPT整理】
  3. Use Octavia to Implement HTTPS Health Monitors (by quqi99)
  4. 查找数组中重复数字并输出
  5. 阿里李睿博谈自己的折腾路:整个过程爱最重要
  6. 定义一个字典——Dictionary
  7. linux 共享文件夹 安装,linux – Vagrant并在共享文件夹中安装包
  8. 以python自定义模块的方式共享API(数据,短信通知、邮件通知,代理等)
  9. 2018美国大学计算机科学,2018usnews美国大学设计研究生计算机科学专业排名
  10. linux(centos)服务器时间校正