POJ-1753 Flip Game 枚举 状态压缩
刚开始做这题时总是在想应该用何种的策略来进行翻装,最后还是没有想出来~~~
这题过的代码的思路是用在考虑到每个点被翻装的次数只有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 枚举 状态压缩相关推荐
- J - 最强王者 POJ - 1753 Flip Game 搜索+状态压缩
J - 最强王者 POJ - 1753 Flip game is played on a rectangular 4x4 field with two-sided pieces placed on e ...
- POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)
题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完 ...
- 计蒜客 A2236 马的管辖 暴力枚举 状态压缩
题目描述 原题链接 分析 结果填空题, 不用考虑时间复杂度,直接暴力枚举每一种方案 5×55×55×5的棋盘, 每一个格子有放或不放马两种状态, 所以一共需要枚举2252^{25}225种方案 每一种 ...
- POJ 2411 Mondriaan's Dream(状态压缩DP)
题目链接 早就见过这个题,开始以为有公式的,推了几次没推出,后来知道这个题是状态压缩DP.最近开始看状态压缩,本想试着解出来,但是这个比那个牛吃草复杂多了...位运算还是不是很熟练,这个题的解题报告有 ...
- POJ 1753 Flip Game DFS枚举
看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...
- POJ 1753 Flip Game(递归枚举)
题目:1753 题意:有一个4*4的棋盘,棋盘上有黑白格,每一次你可以翻其中的一个格子.一个格子(x,y)如果被翻,它相邻的前后左右四个格子(如果在棋盘上)也要翻转.现在给你一个初始的棋盘状态,问把这 ...
- POJ 1753 位运算+枚举
题意: 给出4*4的棋盘,只有黑棋和白棋,问你最少几步可以使棋子的颜色一样. 游戏规则是:如果翻动一个棋子,则该棋子上下左右的棋子也会翻一面,棋子正反面颜色相反. 思路: 都是暴搜枚举. 第一种方法: ...
- POJ 1753 Flip Game(回溯)
文章目录 1. 题目 1.1 题目链接 1.2 题目大意 1.3 解题思路 2. 代码 2.1 Wrong Answer代码 2.2 Accepted代码 1. 题目 1.1 题目链接 http:// ...
- poj 1753 Flip Game 高斯消元 异或方程组 求最值
题目链接:http://poj.org/problem?id=1753 题意:给出一张4*4的图,表示16个方格的初始颜色的情况(白或黑),相邻方格操作的时候会相互影响,求最少的操作次数,使得每个方格 ...
最新文章
- 运行ORB-SLAM笔记_使用篇(二)
- java计算两个日期相差月数
- 在ASP.NET中防止注入攻击[翻译]
- linux软件卸载不了,linux软件卸载
- 一个非常感人的爱情故事
- [机器学习]-[数据预处理]-中心化 缩放 KNN(二)
- java中class.forName和classLoader加载类的区分
- 网站使用 VideoPlayer 方法
- webstorm 主题导入方法
- Java连接HBase数据库,操作HBase数据库
- android远程主机强迫关闭了一个现有的连接,远程主机强迫关闭了一个现有的连接解决方法...
- onTouchEvent事件不敏感
- 高分辨率笔记本上解决VIM字号显示大小问题
- 中国「人造太阳」1.2亿摄氏度持续百秒,5倍时长打破可控核聚变世界纪录
- oracle ora 3136,ALERT日志中常见监听错误:ORA-3136错误的排查
- 今天老夫就把完全背包的底裤给你扒出来瞅瞅!!!
- poi方式读取word目录大纲
- X_Forward_For(XXF)获取用户IP
- Java String的API方法总结
- 众怒难犯 三星在李在镕接班计划上采取迂回策略
热门文章
- 判断输入是否为中文的函数
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型
- 98级计算机应用教材,西安外事学院98级计算机应用9806班毕业二十年校友返校
- hash hashcode变化_hashmap重写key的hashcode问题
- python 二进制流转图片_Python零基础入门到精通-5.1节:Python程序的执行过程
- python语音合成 标贝_tacotronV2 + wavernn 实现中文语音合成(Tensorflow + pytorch)
- npm install 报错 npm ERR! code Z_BUF_ERROR 问题解决
- Map接口及其常用方法
- iOS SwiftUI篇-1 项目结构
- cfl3d linux 编译,CMake build system for cfl3d