Nim游戏中的状态
先手必胜状态:先手操作完,可以走到某一个必败状态
先手必败状态:先手操作完,走不到任何一个必败状态
先手必败状态:a1 ^ a2 ^ a3 ^ ... ^an = 0
先手必胜状态:a1 ^ a2 ^ a3 ^ ... ^an ≠ 0
结论
假设n堆石头,石头的数量分别是a1,a2,a3……an。如果a1^a2^a3……^an ≠ 0,先手必胜;否则先手必败
证明与解释
- 这场游戏的终态是 0^0^0^0^0^……^0 = 0
- 在操作过程中,如果 a1^a2^a3……^an ≠ 0,那么下一个玩家必定可以通过拿一个或者多个石头使得结果变成0.
- 所以如果先手遇到a1^a2^a3……^an = 0的局面,双方都进行最优解操作,无论先手怎么最终都会是后手让等式=0,从而导致先手必败状态。
证明(NIM博弈)
Nim游戏题目描述
给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
代码
#include <iostream>
using namespace std;
int main()
{
int n;
int res = 0;
cin >> n;
while(n--)
{
int x;
scanf("%d",&x);
res ^= x;
}
if(res != 0)puts("Yes");
else puts("No");
return 0;
}