zoj 1039 Number Game
来源:互联网 发布:行知实验小学 编辑:程序博客网 时间:2024/05/17 19:55
题目链接:zoj 1039 Number Game
博弈dp , 这类题目都有很大的相似性
mask 状态压缩,dp[mask] 表示mask的集合没有取是否为必胜态,dp[mask] = 1 必胜; dp[mask] = -1 必败 ,记忆化搜索即可
在从mask除去x点时,我用了多重背包的思想,判断是否存在可行解后,如果存在就输出第一步可能走的所有情况
#include <iostream>#include <cstdio>#include <cstring>using namespace std;char dp[1<<20];int eras(int mask,int x){ int bit[21]; for(int i=2;i<=20;i++) bit[i]=1; int ret=mask^(1<<(x-2)); for(int i=2;mask;mask>>=1,i++) if(mask&1) bit[i]=0; bit[x]=1; for(int i=2;i<=20;i++) if(i+x<=20&&bit[i]&&!bit[i+x]){ ret^=(1<<(i+x-2)); bit[i+x]=1; } return ret;}bool dfs(int mask){ if(mask==0) return 0; if(dp[mask]!=-1) return dp[mask]; for(int i=2;i<=20;i++) if((mask&(1<<(i-2)))) { int ns=eras(mask,i); if(!dfs(ns)) return dp[mask]=1; } return dp[mask]=0;}int main(){ int T,ca=1,n,a; scanf("%d",&T); memset(dp,-1,sizeof(dp)); while(T--) { scanf("%d",&n); int state=0; for(int i=0;i<n;i++) { scanf("%d",&a); state|=1<<(a-2); } printf("Scenario #%d:\n",ca++); if(!dfs(state)) puts("There is no winning move."); else { printf("The winning moves are:"); for(int i=2;i<=20;i++) if(state&(1<<(i-2))&&!dfs(eras(state,i))) printf(" %d",i); puts("."); } puts(""); } return 0;}
- ZOJ 1039 Number Game
- zoj 1039 Number Game
- zoj 1039 Number Game
- zoj - 1039 Number Game
- ZOJ-1039 Number Game(SG博弈)
- ZOJ - 3180 Number Game
- zoj 3180 Number Game
- ZOJ 3908 Number Game
- ZOJ-3908-Number Game
- ZOJ 3908Number Game
- 【瞎搞】 ZOJ 3180 Number Game
- 【贪心】 ZOJ 3908 Number Game
- zoj 3908 Number Game(STL)
- ZOJ 1039 Number Game (状态压缩,记忆化搜索)
- ZOJ 1039 Number Game 记忆化搜索+二进制状态压缩
- ZOJ 3180 Number Game(数学啊 )
- ZOJ 3908 Number Game(乱搞)
- ZOJ 3449:Doraemon's Number Game III
- 黑马程序员-java基础下
- java反射的原理
- C++中wstring与string相互转化
- 判断两个整数相加会不会溢出
- 交换两序列a,b中的元素,使序列a的和与序列b的和之间的差值最小
- zoj 1039 Number Game
- tomcat_6.0.30绿色版_完整配置方法
- vim 学习进阶(from vim用户手册)
- 光照基础指南
- autotools系列工具—-自动生成Makefile
- 一个 Linux 上分析死锁的简单方法
- 排序算法 冒泡排序
- statement切割SQL语句中的转义符使用
- Symbian 文本编辑器(Editor) (转)