poj1753 Flip Game 状态压缩+bfs
来源:互联网 发布:提额软件 编辑:程序博客网 时间:2024/05/20 00:17
传送门:poj1753 Flip Game
题目的大意
在一个4*4的方格里面放黑或者白之一的卡片,当选中一个的,选中的那个就会翻转(如果是白色变为黑色,如果是黑色变为白色),伴随着他四周(上下左右)的的卡片也会翻转。就像下面这种情况,
如图所示,假设我们点击第三行第一列的时候不仅仅第三行第一列会变换状态,相应的第二行第一列,第三行第二列,第四行第一列也会变换,当然如果左边有的话也会变换状态。上图对应输入为:
bwbw wwww bbwb bwwb
当点击完第三行第一列的时候,会变为下面的状态:
bwbw bwww wwwb wwwb
w代表white白色,b代表black黑色
输入:输入4*4只包含b
或者w
的矩阵
输出:通过几次能改变为全为白色或者全为黑色,如果不能输入impossible
。
解题思路
bfs+状态压缩
棋盘一共是有16方格,也就意味着有2^16(65535)种状态,
我们就假设黑色的棋子的状态为0,白色状态的棋子为1
每种方格只能被点击一次,比如我们在一个全为黑色点击了左上角的棋子,棋盘如下:
bbbbbbbbbbbbbbbb
抽象为对应的状态棋盘
就变为
0000000000000000
点击左上角的棋子之后,状态棋盘就变为:
1100100000000000
我们默认上面的和左边的高位,所以对应的二进制转换为十进制就变为51200
当点击其他的时候也是一样的原因。
有了这16中状态我们就可以通过异或
来得到点击完相应的棋子之后的状态。
AC代码
#include<cstdio>#include<string>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<set>#include<iostream>#include<stack>using namespace std;struct Node{ int state; int step;};bool visit[65536];int change[16] = //这个是点击每个棋子的状态{ 51200,58368,29184,12544, 35968,20032,10016,4880, 2248,1252,626,305, 140,78,39,19};int bfs(int state){ memset(visit,false,sizeof(visit)); Node cur; Node next; int i,j; cur.step = 0; cur.state= state; visit[state] = true; queue<Node>q; q.push(cur); while(!q.empty()) { cur = q.front(); q.pop(); if(cur.state == 0 || cur.state == 0xffff)//当全为白或者全为黑的情况 return cur.step; for(i=0;i<16;i++)//一共有16个棋子 { next.state = cur.state^change[i];//得到点击棋子之后的状态 next.step = cur.step+1; //步骤+1 if(next.state == 0 || next.state == 0xffff) return next.step; if(visit[next.state]) //已经遍历过中的状态 continue; visit[next.state] = true;//如果没有遍历过这种状态,改变为遍历过 q.push(next);//添加到队列中 } } return -1;}int main(){ int i,j,state,ans; char theMap[5][5]; while(scanf("%s",theMap[0])!=EOF) { for(i=1;i<4;i++) scanf("%s",theMap[i]); state = 0; for(i=0;i<4;i++) //变输入变把原棋盘的二进制计算出来 for(j=0;j<4;j++) { state <<= 1; if(theMap[i][j] == 'b') state+=1; } //printf("[%d]\n",state); ans = bfs(state); if(ans == -1) printf("Impossible\n"); else printf("%d\n",ans); } return 0;}
0 0
- poj1753 Flip Game 状态压缩+bfs
- 【POJ1753】Flip Game(位压缩+bfs)
- poj1753 Flip Game 枚举+BFS
- Flip Game(poj1753,状态压缩+暴力枚举)
- 【BFS+状态压缩】-POJ-1753-Flip Game
- POJ 1753 Flip Game(状态压缩BFS)
- POJ 1753 Flip Game(BFS+状态压缩)
- Flip Game(状态压缩+BFS)
- ZOJ-2050-Flip Game【状态压缩bfs】
- Poj_1753 Flip Game(状态压缩,bfs)
- POJ1753,Flip Game,枚举,bfs都可以
- POJ1753《Flip Game》方法:BFS+Bit
- poj1753 Flip Game BFS+位运算
- POJ1753 Flip Game(位压+BFS)
- poj1753 Flip Game —— bfs
- #POJ1753#Flip Game(位运算+BFS)
- POJ 1753 Flip Game BFS+位压缩状态
- zoj 2050 || poj 1753 Flip Game(状态压缩 简单BFS)
- Android 实现类似IOS App唤醒的代理方法
- shell使用小结
- Python知识点整理(基础篇)
- 欢迎使用CSDN-markdown编辑器
- 二叉树的递归和非递归实现 java
- poj1753 Flip Game 状态压缩+bfs
- java/Character类/正则表达式/Pattern/Matcher/Math/Random类
- Intellij Idea 15中开发Maven+osgi项目(Apache felix环境)
- Codeforces 360Div2
- U-boot配置及编译阶段流程宏观分析
- 修改apache的最大连接数
- 在服务的入口req处报流水还是在出口rsp处报流水?
- 【iReport+JasperReport】2.在Java工程中利用jasper导出PDF报表
- hihoCoder 1089 : 最短路径·二:Floyd算法(水题,练手)