poj1753 Flip Game(BFS+位压缩)
题目链接
http://poj.org/problem?id=1753
题意
一个棋盘上有16个格子,按4×4排列,每个格子有两面,两面的颜色分别为黑色和白色,游戏的每一轮选择一个格子翻动,翻动该格子意味着将该格子及其上下左右格子(如果存在的话)的黑面朝上变成白面朝上,反之亦然,游戏的目标是格子全部黑面朝上或者全部白面朝上。输入棋盘的初始状态,求最少经过多少轮可以达到游戏的目标。
思路
求最少轮数,我会想到使用bfs来解决(dfs也可以解决),但使用bfs求解,如果每个状态都直接存储下当前棋盘的话,会消耗很大内存,运算速度也非常慢,如果把黑色格子(b)看成1,白色格子(w)看成0,则16个格子对应一个16位的二进制数,可以用一个int来存储,这样就解决了内存消耗及运算速度的问题了。当棋盘状态为全白0x0000(0)或者全黑0xffff(65535)时,游戏结束。还有一个问题是用二进制位表示的棋盘如何进行翻转。假设当前棋盘为0000 0000 0000 0000,对第0行第0列位置(0,0)进行翻转,翻转后的棋盘为1100 1000 0000 0000,对应的十进制数为51200。我们也可以对剩下的15个位置进行翻转,这样可以得到16个十进制数,对应对棋盘的16个位置进行翻转操作。对于任意一个棋盘状态(十进制数表示为n)来说,如果要对(0,0)进行翻转,则翻转后棋盘状态为n^51200(^表示异或),如果对(0,1)位置进行翻转,则与翻转棋盘0000 0000 0000 0000的(0,1)位置得到的十进制数(58368)异或即可,以此类推,这样就可以对二进制位表示棋盘进行翻转操作了。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <string>
using namespace std; struct Node
{
int state;
int steps; Node(){}
Node(int state, int steps):state(state), steps(steps){}
}; int flip[]; //存储16中翻转状态
int visit[]; //记录棋盘状态是否被访问过
queue<Node> q; void init() //初始化
{
memset(visit, , sizeof(visit));
while(!q.empty()) q.pop(); int dir[][]={ {, }, {-, }, {, }, {, -}};
int temp;
for(int i=; i<; i++) //计算翻转的16种状态
{
for(int j=; j<; j++)
{
temp = ;
temp ^= (<<((-i)* + -j));
for(int k=; k<; k++)
{
int ni = i+dir[k][];
int nj = j+dir[k][]; if(ni>= && ni< && nj>= && nj<)
temp ^= (<<((-ni)* + -nj));
}
flip[i*+j] = temp;
}
}
} int bfs()
{
while(!q.empty())
{
Node node = q.front();
q.pop();
if(node.state== || node.state==)
return node.steps;
for(int i=; i<; i++)
{
Node next;
next.state = node.state^flip[i];
next.steps = node.steps+;
if(!visit[next.state])
{
visit[next.state] = ;
q.push(next);
}
}
}
return -; // "Impossible"
} int main()
{
//freopen("poj1753.txt", "r", stdin);
string s;
int state = ;
for(int i=; i<; i++)
{
cin>>s;
for(int j=; j<; j++)
{
state = state<<;
if(s[j]=='b')
state += ;
}
} init();
q.push(Node(state, ));
visit[state] = ; int ans = bfs();
if(ans == -)
cout<<"Impossible"<<endl;
else cout<<ans<<endl;
return ;
}
参考
1、http://blog.csdn.net/hackbuteer1/article/details/7392245
poj1753 Flip Game(BFS+位压缩)的更多相关文章
- POJ 1753 Flip Game(bfs+位压缩运算)
http://poj.org/problem?id=1753 题意:一个4*4的棋盘,只有黑和白两种棋子,每次翻转一个棋子,并且其四周的棋子也跟着翻转,求棋盘全为黑或全为白时所需的最少翻转次数. 思路 ...
- hdu 1429 胜利大逃亡(续)(bfs+位压缩)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- POJ 2965 The Pilots Brothers' refrigerator (枚举+BFS+位压缩运算)
http://poj.org/problem?id=2965 题意: 一个4*4的矩形,有'+'和'-'两种符号,每次可以转换一个坐标的符号,同时该列和该行上的其他符号也要随之改变.最少需要几次才能全 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)
Description Flip game squares. One side of each piece is white and the other one is black and each p ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- BFS+状态压缩 HDU1429
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- NowCoder猜想(素数筛法+位压缩)
在期末被各科的大作业碾压快要窒息之际,百忙之中抽空上牛客网逛了逛,无意中发现一道好题,NowCoder猜想,题意很明显,就是个简单的素数筛法,但竟然超内存了,我晕(+﹏+)~ 明明有 3 万多 k ...
- HDU1429+bfs+状态压缩
bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...
随机推荐
- discuz更换域名,登录不了解决
准备工作 :因为域名更换了,因此原域名就不能再进后台了,请申请好新域名,并正确备案,让机房添加白名单,重新解析,重新绑定空间..... 完成一系列工作后,进入DZ程序修改. ------------- ...
- openstack配置模块
一.简介 openstack中负责处理配置的模块是oslo.config,它可以处理配置项和配置文件.通常的配置处理都是如下形式: from oslo.config import cfg CONF=c ...
- 子集系列(二) 满足特定要求的子集,例 [LeetCode] Combination, Combination Sum I, II
引言 既上一篇 子集系列(一) 后,这里我们接着讨论带有附加条件的子集求解方法. 这类题目也是求子集,只不过不是返回所有的自己,而往往是要求返回满足一定要求的子集. 解这种类型的题目,其思路可以在上一 ...
- 树形dp的进阶 (一)
①树的重心的性质的运用 ②缩点以后寻找规律 树的直径! ③树形dp上的公式转换 ④和期望有关的树形dp + 一点排列组合的知识 ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 一:Codeforces Round #364 ...
- HDU 6205 尺取
容易看出来,扩增一倍,找最长的区间就行了 /** @Date : 2017-09-11 12:43:11 * @FileName: 1012.cpp * @Platform: Windows * @A ...
- 如何写出高性能SQL语句
优化SQL查询:如何写出高性能SQL语句 1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生欀如一条SQL语句如果 ...
- 【费用流】【CODEVS】1227 方格取数2
[算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...
- HTML如何编写为桌面程序
学过/用过HTML的人应该都知道HTML是标记语言,是在网页上执行/使用的,在这里小编告诉你HTML也可以用来做桌面程序,这种桌面程序一般是微客户端 工具/原料 html dreamweaver ...
- 健身VS不健身,完全是两种不同的人生!
这两天一组同龄人合照 刷爆了国内健身圈, 图左是一位67岁的老人, 图右是67岁的健美运动员杨新民老师 相同年龄, 但从外观上有着强烈的距离感! 让多人不禁感叹,健身和不健身, 简直就是两种状态,两种 ...
- vuex实例详解
vuex是一个专门为vue.js设计的集中式状态管理架构.状态?把它理解为在data中的属性需要共享给其他vue组件使用的部分. 简单的说就是data需要共用的属性 一.小demo 已经用Vue脚手架 ...