组合博弈之SG入门
2016-08-06 12:53
393 查看
记录一个菜逼的成长。。
步骤1:将所有终结位置标记为必败点(P点);
步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)
步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;
步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。
【HD1846】Brave Game
暴力SG表
【HD2147】kiki’s game
规律
【HD2188】悼念512汶川大地震遇难同胞——选拔志愿者
打SG表找规律
【HD2149】Public Sale
1. 如果 m <= n 直接输出 m 到 n的数;
2. 打sg表判断sg[m]是否为0 ,为0则直接输出none ;不为0 ,则转化为(m-x,n)的问题,所以从m往前扫描直到sg[i] = 0;
步骤1:将所有终结位置标记为必败点(P点);
步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)
步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;
步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。
【HD1846】Brave Game
暴力SG表
#include <bits/stdc++.h> using namespace std; const int maxn = 1000; int sg[maxn]; bool Hash[maxn]; void sg_solve(int n,int m) { memset(sg,0,sizeof(sg)); for( int j,i = 1; i <= n; i++ ){ memset(Hash,0,sizeof(Hash)); for( j = 1; j <= min(i,m); j++ ){ Hash[sg[i-j]] = 1; } for( j = 0; j <= n; j++ ){ if(!Hash[j])break; } sg[i] = j; } } int main() { int T;scanf("%d",&T); while(T--){ int n,m; scanf("%d%d",&n,&m); sg_solve(n,m); printf("%s\n",sg ?"first":"second"); } return 0; }
【HD2147】kiki’s game
规律
#include <bits/stdc++.h> using namespace std; int main() { int n,m; while(~scanf("%d%d",&n,&m)){ if(!n && !m)break; printf("%s\n",n%2&&m%2?"What a pity!":"Wonderful!"); } return 0; }
【HD2188】悼念512汶川大地震遇难同胞——选拔志愿者
打SG表找规律
#include <bits/stdc++.h> using namespace std; const int maxn = 10000 + 10; int sg[maxn],Hash[maxn]; void sg_solve(int n,int m) { memset(sg,0,sizeof(sg)); for( int j,i = 1; i <= n; i++ ){ memset(Hash,0,sizeof(Hash)); for( j = 1; j <= min(i,m); j++ ){ Hash[sg[i-j]] = 1; } for( j = 0; j <= n; j++ ){ if(!Hash[j])break; } sg[i] = j; } } int main() { int T;scanf("%d",&T); while(T--){ int n,m; scanf("%d%d",&n,&m); if(n <= m){ printf("Grass\n"); } else { //sg_solve(n,m); printf("%s\n",n%(m+1)?"Grass":"Rabbit"); } } return 0; }
【HD2149】Public Sale
1. 如果 m <= n 直接输出 m 到 n的数;
2. 打sg表判断sg[m]是否为0 ,为0则直接输出none ;不为0 ,则转化为(m-x,n)的问题,所以从m往前扫描直到sg[i] = 0;
#include <bits/stdc++.h> using namespace std; const int maxn = 1100 + 10; int sg[maxn],Hash[maxn]; void sg_solve(int n,int m) { memset(sg,0,sizeof(sg)); for( int j,i = 1; i <= n; i++ ) { memset(Hash,0,sizeof(Hash)); for( j = 1 ; j <= min(i,m); j++ ){ Hash[sg[i-j]] = 1; } for( j = 0; j <= n; j++ ) if(!Hash[j])break; sg[i] = j; } } int main() { int n,m; while(~scanf("%d%d",&m,&n)){ if(n >= m){ for( int i = m; i <= n; i++ ){ if(i == m)printf("%d",i); else printf(" %d",i); } puts(""); } else { sg_solve(m,n); if(!sg[m])printf("none\n"); else { for( int i = m; i >= 0; i-- ){ if(!sg[i]){ printf("%d\n",m - i); break; } } } } } return 0; }
相关文章推荐
- 组合博弈之SG入门
- 组合博弈问题:从 dfs 到 SG 函数
- 博弈 入门 ( ACM 博弈 组合 )
- 组合博弈小入门
- 组合博弈入门知识汇总
- poj2425(公平组合博弈 SG定理)
- ZOJ 3666 Alice and Bob(博弈 sg 函数入门)
- 博弈入门—NIM&SG
- 【组合博弈】【sg定理】[HNOI2014] bzoj3576 江南乐
- 博弈论 SG函数从懵逼到入门 SG模板 hdu1848
- HDU-1848-组合博弈
- 博弈入门小结2
- 常见组合博弈游戏
- HDU-4664 Triangulation(博弈SG打表+类似凸包性质)
- [BZOJ]1228: [SDOI2009]E&D 博弈SG
- zoj 3529 博弈SG
- HDOJ1730[SG博弈]
- HDU 3032 Nim or not Nim?(博弈,SG打表找规律)
- hdu 1848 sg博弈模版题
- POJ 2599 A funny game(组合博弈 P/N态+记忆化搜索)