POJ1753 Flip Game题解
题目大意:
在一个4*4的方格中有16个双面棋子他们分别是黑面和白面,我们可以选择任意一颗棋子进行翻转,翻转后其上下左右的棋子也会被翻转,要求我们对棋子进行翻转求出棋子全部翻为黑色或者全部翻为白色的最少次数,若翻不出来则输出IMPOSSIBLE。
问题解析:
由题意可知,我们对16颗棋子有翻面或者不翻面两种状态,同时我们知道每一颗棋子若翻两次则等于没有翻面,所以我们只要从第一颗棋子遍历到第十六颗棋子分别枚举他们翻面和不翻面的状态即可获得答案,这样就得到了我们的搜索树的最大深度为16;
如果正常的搜索,我们需要列举出第几行,第几列棋子,以及到目前状态所翻转的次数,这样就有三个状态量,,但是当我们转移到下一个状态的时候就会有较为繁琐,因此我们采用的是一个变量n来存放他的状态,此时行坐标为: n/4 ,列坐标为 n%4;AC代码如下
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s[5];
const int NotFound = -1;
const int INF = 0x3f3f3f3f;
int nxt[][2] ={{0,0},{0,1},{0,-1},{1,0},{-1,0}//五个翻转棋子状态
};
void filp(int n)//对n及其周围的棋子进行翻转
{int x = n/4;int y = n%4;for(int i=0;i<5;i++)//对自身和周围四颗棋子进行翻转{int nx = x + nxt[i][0];int ny = y + nxt[i][1];if(nx<0 || ny<0 || nx>=4 || ny>=4)continue;else{if(s[nx][ny] == 'w') s[nx][ny] ='b';else s[nx][ny] = 'w';}}
}
bool trick()
{for(int i=0;i<4;i++){for(int j=0;j<4;j++)if(s[i][j] != s[0][0])return false;}return true;
}
int dfs(int n,int ans)
{if(trick())return ans;if(n >16)return INF;filp(n);//翻转int ans1 = dfs(n+1,ans+1);filp(n);//翻转回来置为初始状态int ans2 =dfs(n+1,ans);return min(ans1,ans2);
}
int main()
{for(int i=0;i<4;i++)cin>>s[i];int res = dfs(0,0);if(res !=INF)cout<<res;elsecout<<"Impossible";return 0;
}
POJ1753 Flip Game题解相关推荐
- poj1753 Flip Game(枚举Enum+dfs)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1753 ------ ...
- POJ1753 Flip Game
题目链接:http://poj.org/problem?id=1753 大致题意:翻转游戏在一个长方形的4x4场地上进行,在其16个方格中分别放置双面棋子.每个棋子的一面是白色,另一面是黑色,每个都是 ...
- POJ-1753 Flip Game 枚举 状态压缩
刚开始做这题时总是在想应该用何种的策略来进行翻装,最后还是没有想出来--- 这题过的代码的思路是用在考虑到每个点被翻装的次数只有0次或者是1次,所以对于16个点就只有2^16中请况了.再运用位运算将状 ...
- poj1753 Flip Game
2017-10-5 解答 与开灯问题类似.从上向下看,第一行的只与本行以及下一行有关,搜索可缩小至2的N次方 代码 #include<iostream> using namespace s ...
- POJ1753 翻转游戏 题解
题目大意 有一个4×4的棋盘,上面放满棋子,棋子一面是白色,另一面是黑色.每次翻转一枚棋子,同时与这枚棋子相邻的上下左右的棋子也要翻转.问能否通过数次翻转使得所有的棋子全部白色面朝上或全部黑色面朝上呢 ...
- POJ1753 flip Game翻转棋盘
/*题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色. 游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时, ...
- NC106350 POJ1753 Flip Game 翻转游戏
网上上课写的题目 POJ传送们http://poj.org/problem?id=1753 先贴代码,感觉里面重点部分说的已经比较清楚了 #include <iostream> #inc ...
- AGC 049 总结+ABCD题解
AGC 049 总结+ABCD题解 比赛链接 赛况: 202 Gary{\color{Yellow} \textrm{Gary} }Gary 1800(4)187:231800 (4)\\187:23 ...
- POJ-2965 The Pilots Brothers' refrigerator
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27917 A ...
最新文章
- 统计php脚本执行时间的php扩展
- Python爬虫入门教程 33-100 《海王》评论数据抓取 scrapy
- Spark之伪分布式搭建、伪分布式Hadoop、Hive安装
- java 7.函数-递归_带有谓词的Java中的函数样式-第1部分
- 调试生产服务器– Eclipse和JBoss展示
- Nginx整合tomcat,实现反向代理和负载均衡
- WordPress WP cleanfix插件‘eval()’函数跨站请求伪造漏洞
- Android 自定义View(二)绘制一个封闭多边形
- TextView属性android:ellipsize实现跑马灯效果
- linux实现快捷键,Linux Bash下如何实现快捷键效果
- windows注册表文件损坏了,导致windows无法启动,解决办法!
- matlab如何设全局变量,请问MATLAB中如何修改全局变量
- 计算机环境怎么安装包,win10游戏运行环境包怎么安装_win10电脑游戏运行环境包安装详细步骤...
- Qt实现YOLO目标检测及其界面制作
- 多测师杭州拱墅校区__肖sir__软件测试生命周期(4)
- Python计算某年某月某日天数
- logo一键制作器源码
- ansible:变量调用set_fact和register
- 自然语言处理是什么?学习自然语言处理(NLP)
- 几款国外主流虚拟主机控制面板介绍