USTCOJ 1240,黑屋:http://acm.ustc.edu.cn/ustcoj/problem.php?id=1240

该题采用暴力枚举的方式,通过位运算加速开关灯操作。

若理解有困难,可移步“USTCOJ 1240 黑屋 非位运算版”http://blog.csdn.net/l03071344/article/details/8884790了解该解法基本思想。

百练相关题目为:http://poj.grids.cn/practice/1753。相关解法有:

http://www.cnblogs.com/HappyAngel/archive/2010/05/12/1734108.html
http://blog.chinaunix.net/uid-22263887-id-1778972.html
http://www.cnblogs.com/shuaiwhu/archive/2012/04/27/2474041.html
http://www.cppblog.com/Yusi-Xiao/archive/2009/03/21/77383.html

/********************************************
*原作者:scuwf。代码编号:53947
*代码完善及注释作者:baird。代码编号:71756
*第一次代码完善及注释作者:baird。代码编号:71756
*第二次代码完善及注释作者:Lance。代码编号:71824
********************************************/#include <stdio.h>
#define MAX 150             //最大数据规模
#define MAX_CASE 0x8000     //最大测试数量,2 ^ 15
//此三个数组为全局变量,会自动初始化为全0。多出的一行的为了方便操作。
int lightmap[MAX+1], tempmap[MAX+1], switchstep[MAX_CASE];
//i表示要变换的行的序号。该函数变换第i行中,k的二进制中标为1的位。
//以及这些对应位左侧的灯、右侧的灯、下方的灯。
void run_switch(int i, int kk, int m)
{tempmap[i] ^= kk;           //改变对应位置灯泡状态tempmap[i] ^= kk >> 1;      //改变对应位置右侧灯泡状态tempmap[i] ^= (kk << 1) & ((1 << m) - 1);//改变对应位置左侧灯泡状态tempmap[i + 1] = lightmap[i + 1] ^ kk;  //改变对应位置下方灯泡状态
}//生成每一种行变换的所需的操作步骤
void count_switchstep(void)
{int i, t;for (i = 0; i < MAX_CASE; i++) //i代表行变换的编号。这里for循环记录了所有的行变换所需的{switchstep[i] = 0;         //初始化,switchstep[i]存储了i的二进制表示中1的个数t = i;while (t){switchstep[i] += t & 1;t >>= 1;}}
}int main(void)
{count_switchstep(); //生成每一种行变换的操作步骤int m, n, i, j, k, step, minstep;while (~scanf("%d%d", &n, &m)){minstep = -1; //定义每组测试数据的最小步骤并初始化为下确界for (i = 0; i < n; i++){lightmap[i] = 0;for (j = 0; j < m; j++){scanf("%d", &k);lightmap[i] += k << (m - 1 - j); //读入灯泡地图,用二进制的形式储存每一行的情况}}//暴力枚举第一行的所有可能的变换,一共有2 ^ m次方种变换。//例如k=1000 0000 0001。表示变换第一个和最后一个灯。//因为与1异或,相当于对改位取反;与0异或,该位不变。for (k = 0; k < 1 << m; k++) {step = switchstep[k];       //对第一行进行该种变换所需步数tempmap[0] = lightmap[0];   //初始化第一行数据到testmap中run_switch(0, k, m);for (i = 1; i < n; i++)  //从第二行开始变换,每一行要保证上一行的灯全开(即全为1)。{//~testmap[i - 1] & ((1 << m) - 1)是由上一行灯泡情况而确定的本行的变换,//目的是要保证上一行灯全开int kk = ~tempmap[i - 1] & ((1 << m) - 1);step += switchstep[kk];   //累积在指定第一行变换下,将全部灯打开所需的步数run_switch(i, kk, m);}//通过考察最后一行是否全1,来判断本轮变换是否将所有灯都打开。//若条件成立,再且与当前最小步数进行比较//当minstep值为-1时,step < (unsigned)minstep总是成立。if (tempmap[n - 1] == (1 << m) - 1 && step < (unsigned)minstep)minstep = step;         }//打印结果if (minstep == -1)printf("no solution\n");elseprintf("%d\n", minstep);}return 0;
}

USTCOJ1240 黑屋 位运算相关推荐

  1. USTCOJ 1240 黑屋 非位运算版

    USTCOJ 1240,黑屋:http://acm.ustc.edu.cn/ustcoj/problem.php?id=1240 该题采用暴力枚举的方式求出关灯所需的最少步数.其中press数组标记了 ...

  2. 黑白棋游戏 (BFS + 位运算初步运用)

    题目描述   黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋 子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻 ...

  3. POJ 1753 位运算+枚举

    题意: 给出4*4的棋盘,只有黑棋和白棋,问你最少几步可以使棋子的颜色一样. 游戏规则是:如果翻动一个棋子,则该棋子上下左右的棋子也会翻一面,棋子正反面颜色相反. 思路: 都是暴搜枚举. 第一种方法: ...

  4. opencv位运算,cv2.bitwise_and,cv2.bitwise_or,cv2.bitwise_not,cv2.bitwise_xor

    目录 与运算 或运算 非运算 异或运算 位运算完整代码 与运算 在opencv进行与运算使用cv2.bitwise_and方法 def bitwise_and(src1, src2, dst=None ...

  5. 【NOIP2009】【DLX】【位运算】T4 靶形数独 题解

    小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的"靶形 ...

  6. 动态规划+BFS+DFS+回溯+红黑树+排序+链表+位运算(B站优质学习资源链接,后续会继续更新)

    动态规划 正月点灯笼(UP主) 个人主页 https://space.bilibili.com/24014925/channel/detail?cid=12580 动态规划第一讲 https://ww ...

  7. python中不同进制的整数之间可以直接运算_Python 进制转换、位运算

    一.进制转换 编程用十进制,十进制转换为二进制.八进制.十六进制 In [135]: bin(23) Out[135]: '0b10111' In [136]: oct(23) Out[136]: ' ...

  8. python isodd()判断奇偶_位运算(1的个数;2.判断奇偶)

    1. 1的个数 int NumberOf1(intn){int count = 0;while(n) {++count; n=(n-1)&n; } } 同样一个问题,位运算可以提高程序的运行效 ...

  9. python 整数逆位运算_python训练营:注释、运算符、数据类型与位运算

    天学习的内容整理成脑图如下,其中带☆的是需要重点掌握的模糊知识点,需要加强训练和记忆. 二.具体学习内容 2.1 注释 2.1.1 多行注释 2.1.2 长字符串注释 2.2 运算符 2.2.1 算术 ...

最新文章

  1. 连接网络计算机后用户名更改不,电脑修改ip后无法上网
  2. 大道至简第一章 读后感
  3. matlab-高数 polar 极坐标系 绘制阿基米德线,心形线
  4. [LintCode] Fast Power
  5. C++中的默认初始化
  6. 四、启动OpenLDAP服务器
  7. Rational Rose 下载安装
  8. 超级详细的手写webpack4配置来启动vue2项目(附配置作用)
  9. java 获取泛型_聊聊Java泛型擦除那些事
  10. 中国海洋大学第四届朗讯杯高级组 A 2718 Rocky(模拟)
  11. 颜色直方图的计算、显示、处理、对比及反向投影(How to Use Histogram? Calculate, Show, Process, Compare and BackProject)...
  12. linux ffmpeg 简单视频播放器
  13. 《游戏引擎架构》信息总汇
  14. 第22节 NAT(网络地址转换)—实现公网IP和私网IP之间的转换
  15. 美团校招在线考试笔试题:钱币面值组合
  16. canvas画一个圆锥
  17. java中enhancer试什么_Java Enhancer類代碼示例
  18. 点击高德地图标注没法弹窗_巴彦淖尔果农注意啦!林草局喊你上高德地图标注位置哦...
  19. JavaScript中的 this指向问题
  20. java号段_Java匹配国内手机号码段

热门文章

  1. 误操作清空了回收站文件如何找到文件
  2. C# 委托,匿名方法,lambda表达式使用方法
  3. ccpd文件名转成xml_在Deepin V20/Ubuntu 20.04下安装佳能LBP2900+打印机的方法
  4. 杰出校友王章清董事长
  5. 宇宙的精华与大数据的失败
  6. mysql查询,inner join有多条符合条件的只取其中一条即可
  7. 【特纳斯电子】基于单片机的智能风扇-开题报告
  8. Linux 常用服务搭建笔记(精简笔记)
  9. 微软认证70-541,70-542等考试试题(80%以上的题目是一样的)
  10. 【C++】斐波那契凤尾