POJ 2311 博弈】的更多相关文章

#include<stdio.h> #include<string.h> #include<set> using namespace std; ][]; int solve(int w,int h){ ){ return sg[w][h]; } set<int> my_set; ;w-i>=;i++){ my_set.insert(solve(i,h)^solve(w-i,h)); } ;h-j>=;j++){ my_set.insert(sol…
Cutting Game 题意: 有一张被分成 w*h 的格子的长方形纸张,两人轮流沿着格子的边界水平或垂直切割,将纸张分割成两部分.切割了n次之后就得到了n+1张纸,每次都可以选择切得的某一张纸再进行切割.最先切出只有一个格子的纸张(即有 1*1 格子的)的一方获胜.当双方都采取最优策略时,先手必胜还是必败? 题解: 这题是小白书上的,在取得游戏中必胜策略的最后一题,我照着码一遍就叫了,结果居然T了,,最后发现是cin的问题,然后关下同步就可以a了,但好险用了913ms... 还有初始化mem…
题意:给定一个长方形纸张,每次只能水平或者垂直切,如果切到1*1的方格就胜,问先手胜还是负. 析:根据Nim游戏可知,我们可以分别求出每个子游戏的和,就是答案,所以我们就枚举每一种切法,然后求出SG函数,那么就能得到答案. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib>…
[题目链接] http://poj.org/problem?id=2311 [题目大意] 给出一张n*m的纸,每次可以在一张纸上面切一刀将其分为两半 谁先切出1*1的小纸片谁就赢了, [题解] 如果切出了一张1*n的纸条,那么下一步的人一定可以切出1*1的小纸片, 所以每次切只能切出长宽大于等于2的纸片,如果有人无法做到这一点就输了, 根据这种情况我们用记忆化搜索计算sg函数来得出答案. [代码] #include <cstdio> #include <set> #include…
[题目链接] http://poj.org/problem?id=2311 [算法] 博弈论——SG函数 [代码] #include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #…
Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2844   Accepted: 1036 Description Urej loves to play various types of dull games. He usually asks other people to play with him. He says that playing those games can show his e…
Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4798   Accepted: 1756 Description Urej loves to play various types of dull games. He usually asks other people to play with him. He says that playing those games can show his e…
思路:求SG函数!! 代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; ][]; int getsg(int m,int n) { ) return sg[m][n]; ]; memset(vis,,sizeof(vis)); ;i<=m/;i++) vis[getsg(i,n)^getsg(m-i,n)]=;…
题目链接 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ][]; ]; int get_sg(int n,int m) { ) return sg[n][m]; ;i<=n-i;i++) vis[get_sg(i,m)^get_sg(n-i,m)]=; ;i<=m-i;i++) vis[get_sg(n,i)^get_sg(n,m-i)]=; ; ;i++…
传送门 题意:n*m的纸片,一次切成两份,谁先切出1*1谁胜 Multi-SG? 不太一样啊 本题的要求是后继游戏中任意游戏获胜就可以了.... 这时候,如果游戏者发现某一单一游戏他必败他就不会再玩了 $2*2,2*3,3*3$都不会再玩了(除非只剩下这样的纸片了),所以都可以认为是终止状态,必败 在此基础上按照Multi-SG递推就对了 #include <iostream> #include <cstdio> #include <algorithm> #includ…