nim游戏定义:
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; }