POJ_1753_Flip Game(二进制枚举)
来源:互联网 发布:c语言图形界面编程 编辑:程序博客网 时间:2024/06/12 01:17
题型:枚举
题意:
4*4的棋盘上面放了16盏灯,有黑有亮。每次按一个灯,会改变本身及其上下左右四个灯的状态,即黑变白或白变黑,问最少需要按几次,可以将所有灯变为同一种状态,不能变则输出“Impossible”。
分析:
如果按个多个灯,可以发现,这些操作的顺序是互不影响的。对于每个灯,按一次翻转,再按一次还原,所以可以发现,每个灯最多按一次足矣。
采用二进制枚举,01串代表按下多少个灯及每个灯的位置,然后转换为操作后的状态并检查是否满足全部同一种状态。复杂度(2^16) * 16
代码:
#include<iostream>#include<cmath>#include<cstring>#include<cstdio>using namespace std;const int inf = 0x3f3f3f3f;char str[6][6];int lamp[6][6];int dir1[] = {0,0,1,-1};int dir2[] = {1,-1,0,0};void Copy() { for(int i=0; i<4; i++) { for(int j=0; j<4; j++) { if(str[i][j] == 'b') { lamp[i][j] = 0; } else { lamp[i][j] = 1; } } }}bool check(int x,int y) { if(x>=0&&x<4 && y>=0&&y<4) return true; return false;}bool judge() { int num0 = 0; int num1 = 0; for(int i=0; i<4; i++) { for(int j=0; j<4; j++) { if(lamp[i][j]) num1++; else num0++; } } if(num0==16 || num1==16) return true; return false;}int main() { while(~scanf("%s",str[0])) { scanf("%s",str[1]); scanf("%s",str[2]); scanf("%s",str[3]); int ans = inf; int step; int all = (1<<16); for(int i=0; i<all; i++) { Copy(); step = 0; for(int j=0; j<16; j++) { if(i&(1<<j)) { step++; int x = j/4; int y = j%4; lamp[x][y] ^= 1; for(int k=0; k<4; k++) { int xx = x + dir1[k]; int yy = y + dir2[k]; if(check(xx,yy)) { lamp[xx][yy]^=1; } } } } if(judge()) { ans = min(ans,step); } } if(ans == inf) { puts("Impossible"); } else { printf("%d\n",ans); } } return 0;}
0 0
- POJ_1753_Flip Game(二进制枚举)
- POJ_1753_Flip Game
- Flip Game (poj 1753)枚举+二进制
- 二进制枚举
- 二进制枚举
- 二进制枚举
- 二进制枚举
- 二进制枚举
- 二进制枚举
- 二进制枚举
- 二进制枚举
- 二进制枚举法枚举子集
- 二进制序列枚举
- 二进制枚举子集
- 二进制枚举集合子集
- 二进制枚举子集
- POJ_3279_Fliptile_搜索、二进制枚举
- POJ 3279二进制枚举
- webService原理和用例
- js 不同浏览器 的判断
- html基础-2
- Flex 4里的fx、mx以及s命名空间
- Hibernate事务和并发控制
- POJ_1753_Flip Game(二进制枚举)
- sqlalchemy整理(二)
- HBase基础知识
- ASP.NET 安全认证(一)—— 如何运用 Form 表单认证 .(转)
- container_of()宏
- devkit8000程序的烧写signGP
- Codeforces Round #FF (Div. 2) C. DZY Loves Sequences
- SQL Server数据类型int、bigint、smallint和tinyint范围简析
- test