HDU 1907、2907 【NIM、anti-NIM】
2016-05-18 21:37
501 查看
nim游戏定义:
anti-nim游戏定义:
而anti-NIM游戏,是取走最后一个石子者败
2. 若一个局面为必败态,则所有操作都只能转化为必胜态
1)若NIM sum=0,则当前局面为必败态
2)若NIM sum≠0,则当前局面为必胜态
nim游戏原题:http://acm.hdu.edu.cn/showproblem.php?pid=1849
1)所有堆的石子个数为1,且NIM_sum=0
2)至少有一堆的石子个数大于1,且 NIM_sum≠0
HDU有两道题均为anti-NIM问题:
http://acm.hdu.edu.cn/showproblem.php?pid=1907
http://acm.hdu.edu.cn/showproblem.php?pid=2509
下面是第一题的代码:
anti-nim游戏定义:
NIM游戏 和 anti-NIM游戏的区别:
NIM游戏,是取走最后一个石子者胜而anti-NIM游戏,是取走最后一个石子者败
游戏通用准则:
1. 若一个局面为必胜态,则总存在一种操作方式将当前状态转化为必败态2. 若一个局面为必败态,则所有操作都只能转化为必胜态
NIM游戏的解法:
将当前局面的所有堆的石子数进行异或(也称为:NIM sum),1)若NIM sum=0,则当前局面为必败态
2)若NIM sum≠0,则当前局面为必胜态
nim游戏原题:http://acm.hdu.edu.cn/showproblem.php?pid=1849
anti-NIM游戏的解法:
一个状态为必胜态,当且仅当:1)所有堆的石子个数为1,且NIM_sum=0
2)至少有一堆的石子个数大于1,且 NIM_sum≠0
HDU有两道题均为anti-NIM问题:
http://acm.hdu.edu.cn/showproblem.php?pid=1907
http://acm.hdu.edu.cn/showproblem.php?pid=2509
下面是第一题的代码:
#include <cstdio> #include <iostream> using namespace std; int main () { int T, n, x, game; bool allOne; scanf("%d", &T); while(T--) { scanf("%d", &n); game = 0; allOne = true; for(int i=0; i<n; i++) { scanf("%d", &x); if(x!=1) allOne = false; game ^= x; } if(allOne && !game || !allOne && game) { printf("%s\n", "John"); } else { printf("%s\n", "Brother"); } } return 0; }
相关文章推荐
- HDU 2147 —— kiki's game
- HDU 1846 —— Brave Game
- Sicily - Water 【寻找规律】
- C++对C扩展之默认参数(default)
- HDU 2746 ——Max Sum Plus Plus Plus 【dfs+带备忘 或 DP】
- Android 开发实战经验总结
- tyvj 1305 —— 长度不超过m的最大连续和 【前缀和+单调队列】
- NYOJ 742 —— 最大m段和 【区间DP】
- NYOJ 1103 —— m划分为n个正整数的个数
- 卡特兰数
- NYOJ 651 —— n划分为2个以上不同正整数的划分个数
- Java集合类的继承关系
- TestNG参数化测试之Excel读取数据
- CSS中的字体背景和盒子模型
- 并查集详解
- NYOJ 571 —— 各种划分数
- NYOJ 90 —— 求正整数n划分为若干个正整数的划分个数
- NYOJ 746 - 正整数n划分为m段,求m段的最大乘积 【区间DP】
- NYOJ 176 、POJ 1664 —— m划分为n个正整数的划分个数
- NYOJ 1077 【博弈+大整数取模】