如果步了解博弈,请先去看看基本的博弈知识。
http://blog.csdn.net/niushuai666/article/details/6638943
NYOJ上博弈类题目链接:
http://acm.nyist.net/JudgeOnline/keysearch.php?key=%E5%8F%96%E7%9F%B3%E5%AD%90
第一个:巴什博弈
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=23
解题思路:
模板题。
代码如下:
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int main() { int N, num, limit; scanf("%d", &N); while(N--) { scanf("%d%d", &num, &limit); if(num % (limit + 1) != 0) printf("Win\n"); else printf("Lose\n"); } return 0; }
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=161
解题思路:
模板题。(这道题题目有点问题,威佐夫博弈第一种取法要求至少取1个石子,要不然没法继续了= =)
代码如下:
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int main() { int num1, num2, tmp; while(scanf("%d%d", &num1, &num2) != EOF) { if(num1 > num2) swap(num1, num2); tmp = floor((num2 - num1) * (1 + sqrt(5.0)) / 2.0); if(tmp == num1) printf("0\n"); else printf("1\n"); } return 0; }
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=135
解题思路:
这道题是巴什博弈和尼姆博弈的杂糅,因为尼姆博弈要求对每一堆石子可以取1-全部,而这道题限制了个数,就成为了巴什博弈。那为什么可以用尼姆博弈的思想来求解呢?
因为我们可以发现,当我们使用巴什博弈取到最后一次时,得到的n%(m+1)结果肯定<m,这样就符合了尼姆博弈的要求,进而可以用尼姆博弈的异或运算来求解。
代码如下:
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int bashi(int m, int n) { return m % (n + 1); } int main() { //freopen("Input.txt", "r", stdin); int ncase, num, i, pernum, limit, ans; scanf("%d", &ncase); while(ncase--) { ans = 0; scanf("%d", &num); for(i = 0; i < num; ++i) { scanf("%d%d", &pernum, &limit); ans ^= bashi(pernum, limit); } if(ans) printf("Win\n"); else printf("Lose\n"); } return 0; }
等研究了再来写一下。