【Nim博弈】Hdu 1850 Being a Good Boy in Spring Festival
2013-05-03 20:40
260 查看
原题链接:点击打开链接
标准的Nim游戏博弈题。
两个人玩游戏,其中有n堆扑克牌(每一堆有任意张数的扑克牌),每人一轮行动,每一次行动可以从一堆牌中任意抽取想抽取的张数。当有人无牌可抽时,则该人失败。
定理:对于nim游戏的某个时刻(假设只有三堆扑克,每堆的数量由xi表示)扑克数量为x1,x2,x3,当且仅当它各部分的“异或”等于0时(即x1⊕x2⊕x3=0),则当前位于必败点。
题目中有问到,如果先手的玩家可以胜利的话,那么输出先手玩家在第一步时可以选择的行动。也就是说,首先,先手玩家满足初始位置在必胜点。参考上述定理可以得出,只要第一步的行动时的X1⊕X2⊕X3...Xn==0;那么,就可以算是一种方法。
参考代码:
标准的Nim游戏博弈题。
两个人玩游戏,其中有n堆扑克牌(每一堆有任意张数的扑克牌),每人一轮行动,每一次行动可以从一堆牌中任意抽取想抽取的张数。当有人无牌可抽时,则该人失败。
定理:对于nim游戏的某个时刻(假设只有三堆扑克,每堆的数量由xi表示)扑克数量为x1,x2,x3,当且仅当它各部分的“异或”等于0时(即x1⊕x2⊕x3=0),则当前位于必败点。
题目中有问到,如果先手的玩家可以胜利的话,那么输出先手玩家在第一步时可以选择的行动。也就是说,首先,先手玩家满足初始位置在必胜点。参考上述定理可以得出,只要第一步的行动时的X1⊕X2⊕X3...Xn==0;那么,就可以算是一种方法。
参考代码:
#include<cstdio> using namespace std; int a[105]; int main() { int k,ans; while(scanf("%d",&k)!=EOF&&k) { ans=0; for(int i=1;i<=k;i++) { scanf("%d",&a[i]); ans^=a[i]; } int an=0; if(ans) { for(int i=1;i<=k;i++) { ans^=a[i]; if(a[i]>=ans) {++an;} ans^=a[i]; } printf("%d\n",an); } else printf("0\n"); } return 0; }
相关文章推荐
- [ACM] hdu 1536 S-Nim(Nim组合博弈 SG函数打表)
- HDU 1536 && HDU 1944 S-Nim (Nim博弈、SG函数模板)
- HDU 1907 John(Nim博弈)
- HDU 5011 Game(Nim博弈)
- ACM学习历程—HDU 3915 Game(Nim博弈 && xor高斯消元)
- hdu1536 S-Nim(博弈)
- Hdu 2509 反NIM博弈
- hdu1850(nim博弈)
- HDU 2509 Be the Winner && HDU 1907 John (Nim博弈变形)
- hdu 1907 John Nim博弈 最后一个取石子者输
- HDU 3389 (Nim博弈变形) Game
- HDU 1536 S-Nim(SG经典博弈)
- [ACM] hdu 1536 S-Nim(Nim组合博弈 SG函数打表)
- HDU 5795 A Simple Nim(博弈)
- HDU 1850 NIM博弈
- HDU 4994 Revenge of Nim(博弈)
- HDU 4994 Revenge of Nim (博弈)
- hdu1536 S-Nim(博弈)
- (hdu 1907)John (Misère Nim,Nim博弈的变形)
- HDU 4994 Revenge of Nim(博弈)