博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-1753 Flip Game 枚举 状态压缩
阅读量:6527 次
发布时间:2019-06-24

本文共 2093 字,大约阅读时间需要 6 分钟。

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

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

  代码如下:

#include 
#include
#include
#include
#define START 0#define END 65535using 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;}

转载地址:http://nevbo.baihongyu.com/

你可能感兴趣的文章
iOS.ReactNative-3-about-viewmanager-uimanager-and-bridgemodule
查看>>
透视校正插值
查看>>
【转载】WinCE6.0 Camera驱动源码分析(二)
查看>>
Cobertura代码覆盖率测试
查看>>
【selenium学习笔记一】python + selenium定位页面元素的办法。
查看>>
Linux禁止ping
查看>>
【Matplotlib】 标注一些点
查看>>
[AX]乐观并发控制Optimistic Concurrency Control
查看>>
自定义类加载器
查看>>
MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)
查看>>
C++构造函数例程
查看>>
把某一列值转换为逗号分隔字符串
查看>>
DLL,DML,DCL,TCL in Oracle
查看>>
android之存储篇_存储方式总览
查看>>
SSE指令集学习:Compiler Intrinsic
查看>>
两种attach to process的方法
查看>>
WCF如何使用X509证书(安装和错误)(二)
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
查看>>
iOS中--NSArray调用方法详解 (李洪强)
查看>>
java异步操作实例
查看>>