刚开始做这题时总是在想应该用何种的策略来进行翻装,最后还是没有想出来~~~

  这题过的代码的思路是用在考虑到每个点被翻装的次数只有0次或者是1次,所以对于16个点就只有2^16中请况了。再运用位运算将状态压缩到一个32位的整型当中,使用异或运算替代普通的运算。用dfs生成排列数。

  代码如下:

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define START 0
#define END 65535
using namespace std;char G[6][6];int status, cpy, how[20], path[20];void pre()
{how[1] = 19, how[2] =39, how[3] = 78, how[4] = 140, how[5] = 305;how[6] = 626, how[7] = 1252, how[8] = 2248, how[9] = 4880, how[10] = 10016;how[11] = 20032, how[12] = 35968, how[13] = 12544, how[14] = 29184;how[15] = 58368, how[16] = 51200;// 对每一个点进行反转所影响的区域的位压缩存储
}bool dfs(int cur, int pos, int leavings)
{if (leavings == 0) {// 当组合排列完毕cpy = status;for (int i = 0; i < pos; ++i) {cpy ^= how[path[i]];}if (cpy == START || cpy == END) {return true;}else {return false;}}else {for (int i = cur; i <= 16; ++i) {path[pos] = i;if (16-pos < leavings) {  // 剩余的量比要翻装的位置要少continue;}if (dfs(i+1, pos+1, leavings-1)) {return true;}}return false;}
}bool OK(int times)
{if (dfs(1, 0, times)) {return true;}else {return false;}
}int main()
{pre();// 读入数据for (int i = 1; i <= 4; ++i) {scanf("%s", G[i]+1);for (int j = 1; j <= 4; ++j) {G[i][j] = G[i][j] == 'b' ? 0 : 1;}}for (int i = 4; i >= 1; --i) {for (int j = 4; j >= 1; --j) {status <<= 1;if (G[i][j]) {status |= 1;// 将整个图压缩到一个32位的数字中
            }}}int times = 0;bool finish = false;while (!finish) {if (times > 16) {break;}if (OK(times)) {finish = true;}else {++times;}}if (finish) {printf("%d\n", times);}else {puts("Impossible");}return 0;
}

转载于:https://www.cnblogs.com/Lyush/archive/2012/06/28/2567289.html

POJ-1753 Flip Game 枚举 状态压缩相关推荐

  1. J - 最强王者 POJ - 1753 Flip Game 搜索+状态压缩

    J - 最强王者 POJ - 1753 Flip game is played on a rectangular 4x4 field with two-sided pieces placed on e ...

  2. POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)

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

  3. 计蒜客 A2236 马的管辖 暴力枚举 状态压缩

    题目描述 原题链接 分析 结果填空题, 不用考虑时间复杂度,直接暴力枚举每一种方案 5×55×55×5的棋盘, 每一个格子有放或不放马两种状态, 所以一共需要枚举2252^{25}225种方案 每一种 ...

  4. POJ 2411 Mondriaan's Dream(状态压缩DP)

    题目链接 早就见过这个题,开始以为有公式的,推了几次没推出,后来知道这个题是状态压缩DP.最近开始看状态压缩,本想试着解出来,但是这个比那个牛吃草复杂多了...位运算还是不是很熟练,这个题的解题报告有 ...

  5. POJ 1753 Flip Game DFS枚举

    看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...

  6. POJ 1753 Flip Game(递归枚举)

    题目:1753 题意:有一个4*4的棋盘,棋盘上有黑白格,每一次你可以翻其中的一个格子.一个格子(x,y)如果被翻,它相邻的前后左右四个格子(如果在棋盘上)也要翻转.现在给你一个初始的棋盘状态,问把这 ...

  7. POJ 1753 位运算+枚举

    题意: 给出4*4的棋盘,只有黑棋和白棋,问你最少几步可以使棋子的颜色一样. 游戏规则是:如果翻动一个棋子,则该棋子上下左右的棋子也会翻一面,棋子正反面颜色相反. 思路: 都是暴搜枚举. 第一种方法: ...

  8. POJ 1753 Flip Game(回溯)

    文章目录 1. 题目 1.1 题目链接 1.2 题目大意 1.3 解题思路 2. 代码 2.1 Wrong Answer代码 2.2 Accepted代码 1. 题目 1.1 题目链接 http:// ...

  9. poj 1753 Flip Game 高斯消元 异或方程组 求最值

    题目链接:http://poj.org/problem?id=1753 题意:给出一张4*4的图,表示16个方格的初始颜色的情况(白或黑),相邻方格操作的时候会相互影响,求最少的操作次数,使得每个方格 ...

最新文章

  1. 运行ORB-SLAM笔记_使用篇(二)
  2. java计算两个日期相差月数
  3. 在ASP.NET中防止注入攻击[翻译]
  4. linux软件卸载不了,linux软件卸载
  5. 一个非常感人的爱情故事
  6. [机器学习]-[数据预处理]-中心化 缩放 KNN(二)
  7. java中class.forName和classLoader加载类的区分
  8. 网站使用 VideoPlayer 方法
  9. webstorm 主题导入方法
  10. Java连接HBase数据库,操作HBase数据库
  11. android远程主机强迫关闭了一个现有的连接,远程主机强迫关闭了一个现有的连接解决方法...
  12. onTouchEvent事件不敏感
  13. 高分辨率笔记本上解决VIM字号显示大小问题
  14. 中国「人造太阳」1.2亿摄氏度持续百秒,5倍时长打破可控核聚变世界纪录
  15. oracle ora 3136,ALERT日志中常见监听错误:ORA-3136错误的排查
  16. 今天老夫就把完全背包的底裤给你扒出来瞅瞅!!!
  17. poi方式读取word目录大纲
  18. X_Forward_For(XXF)获取用户IP
  19. Java String的API方法总结
  20. 众怒难犯 三星在李在镕接班计划上采取迂回策略

热门文章

  1. 判断输入是否为中文的函数
  2. 朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型
  3. 98级计算机应用教材,西安外事学院98级计算机应用9806班毕业二十年校友返校
  4. hash hashcode变化_hashmap重写key的hashcode问题
  5. python 二进制流转图片_Python零基础入门到精通-5.1节:Python程序的执行过程
  6. python语音合成 标贝_tacotronV2 + wavernn 实现中文语音合成(Tensorflow + pytorch)
  7. npm install 报错 npm ERR! code Z_BUF_ERROR 问题解决
  8. Map接口及其常用方法
  9. iOS SwiftUI篇-1 项目结构
  10. cfl3d linux 编译,CMake build system for cfl3d