题目链接:http://poj.org/problem?id=1753

大致题意:翻转游戏在一个长方形的4x4场地上进行,在其16个方格中分别放置双面棋子。每个棋子的一面是白色,另一面是黑色,每个都是黑色或白色朝上。每一轮你翻转3至5个,将被翻转的棋子的颜色从黑色改为白色,反之亦然。根据以下规则,每轮选择要翻转的棋子: ①选择16个中的任何一个②将所选择棋子以及该棋子相邻的上下左右棋子翻转(如果有的话)

解题思路:

①对于每个格子,它要么反转0次,要么反转1次(当然,它的邻格子也跟着反转),因为它反转偶数次和反转0次的效果是一样的,同理反转奇数次的效果和反转1次的效果是一样的。
②由于只有16个格子,我们可以选择0个格子,1个格子,2个格子,3个格子......进行反转,总的选择情况为

③当0个格子被反转时,看它是否为纯色,否则选择一个格子进行反转(有16种选择),看反转后是否为纯色,否则选择两个格子进行反转(有120种选择),看反转后是否为纯色。
④只要③中有纯色出现,就停止③,输出相应的被选择的格子个数,结束。如果16个格子都被翻转了,还是没变成纯色,则输出“Impossible”。

⑤分别写一个判断是否一个颜色的judge函数和一个翻转flip函数,在这里可以将棋盘扩大成6*6,这样保证最中间的4*4,及题目所给的棋盘的每一个棋子都有上下左右棋子。

⑥设所要翻转的棋子为(i,j),则对这个棋子进行翻转时需要同时翻动(i-1,j).(i+1,j)(i,j)(i,j-1)(i,j+1),这五个棋子,所以在最初可以设置一个r={-1,1,0,0,0},c={0,0,-1,1,0},便于翻转函数flip的编写。

棋盘
  0 1 2 3 4 5
0            
1   棋子 棋子 棋子 棋子  
2   棋子 棋子 棋子 棋子  
3   棋子 棋子 棋子 棋子  
4   棋子 棋子 棋子 棋子  
5            

AC代码:

#include <iostream>
using namespace std;
bool chess[6][6] = {0};
bool flag;
int deep;
int step;
int row[5] = {-1,1,0,0,0};
int col[5] = {0,0,-1,1,0};int judge()//判断是不是全黑或全白
{for(int i=1; i<5; i++)for(int j=1; j<5; j++)if(chess[i][j] != chess[1][1])return 0;return 1;
}void flip(int r,int c)//翻棋
{for(int i=0; i<5; i++)chess[r+row[i]][c+col[i]] =!chess[r+row[i]][c+col[i]];
}void dfs(int r,int c,int deep)
{if(deep == step){flag = judge();return;}if(flag||r==5)return;//翻棋flip(r,c);if(c<4)dfs(r,c+1,deep+1);elsedfs(r+1,1,deep+1);//不符合则翻回来flip(r,c);if(c<4)dfs(r,c+1,deep);elsedfs(r+1,1,deep);return;
}
int main()
{char temp;int i,j;for(i=1; i<5; i++){for(j=1; j<5;j++){cin >> temp;if(temp == 'b')chess[i][j] = 1;}}for(step=0; step<16; step++){dfs(1,1,0);if(flag)break;}if(flag)cout << step << endl;elsecout << "Impossible" << endl;return 0;
}

POJ1753 Flip Game相关推荐

  1. poj1753 Flip Game(枚举Enum+dfs)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1753 ------ ...

  2. POJ-1753 Flip Game 枚举 状态压缩

    刚开始做这题时总是在想应该用何种的策略来进行翻装,最后还是没有想出来--- 这题过的代码的思路是用在考虑到每个点被翻装的次数只有0次或者是1次,所以对于16个点就只有2^16中请况了.再运用位运算将状 ...

  3. poj1753 Flip Game

    2017-10-5 解答 与开灯问题类似.从上向下看,第一行的只与本行以及下一行有关,搜索可缩小至2的N次方 代码 #include<iostream> using namespace s ...

  4. POJ1753 Flip Game题解

    题目大意: 在一个4*4的方格中有16个双面棋子他们分别是黑面和白面,我们可以选择任意一颗棋子进行翻转,翻转后其上下左右的棋子也会被翻转,要求我们对棋子进行翻转求出棋子全部翻为黑色或者全部翻为白色的最 ...

  5. POJ1753 flip Game翻转棋盘

    /*题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色. 游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时, ...

  6. NC106350 POJ1753 Flip Game 翻转游戏

    网上上课写的题目  POJ传送们http://poj.org/problem?id=1753 先贴代码,感觉里面重点部分说的已经比较清楚了 #include <iostream> #inc ...

  7. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  8. poj2965 The Pilots Brothers' refrigerator

    //题意:同样给你一个4*4的矩阵,但每一个点代表一个开关,开关可开可闭,只有开关全部打开时才有用,你每一次打开或者关闭一个开关会导致与他相同的行的开关以及与他同列的开关反转,问最少多少次可全部打开并 ...

  9. POJ-2965 The Pilots Brothers' refrigerator

    The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27917 A ...

最新文章

  1. 机器学习与推荐系统实践
  2. 【Python实战】Django建站笔记
  3. nssl1351-矩形反色【离散,差分】
  4. linux数字雨代码解释,linux提权 漏洞合集 linux-kernel-exploits
  5. 基于Fragment的百度地图框架的使用
  6. maven 基本命令
  7. UVALive 4764 dp
  8. dev编译按钮是灰色_提升 50% 的编译速度!阿里零售通 App 工程提效实践
  9. Alexa 世界网站排名研究
  10. 没有mysql支持时的替代方案
  11. python中nameerror怎么处理_python中的错误如何查看
  12. MGRE ISP是路由器(思科设备)
  13. 公众号快速搭建淘客机器人教程
  14. Google Play的APK下载(APK Downloader)解决方案
  15. 第1课:通过案例对SparkStreaming 透彻理解三板斧
  16. Centos 环境配置总结(持续更新)
  17. 如何在安卓上android studio上构建本地服务器
  18. 【C语言】main 函数的正确写法
  19. SWT学习|常用组件及参数
  20. Dojo 1.6 最新官方教程: Dojo DOM 函数

热门文章

  1. 【信号与系统】如何求系统的冲激响应和阶跃响应
  2. 干货 | 超全整理|Python 操作 Excel 库 xlwings 常用操作详解!
  3. CATIA软件VBA二次开发:Excel文件中点坐标数据导入与生成点应用程序编写
  4. 移动App性能测试包含哪些内容?App性能测试工具有哪些?
  5. android查ip地址,安卓手机查看IP地址的两种方法,  二、进入手机状态
  6. docker磁盘清理
  7. Altium Designer PCB设计规则中英对照
  8. Android繁星眨眼动画效果
  9. Win11怎么查MAC地址?Win11电脑如何查看mac地址?
  10. html用if函数,if函数怎么用的实例