【博弈论 Nim问题】洛谷 P2197 【模板】Nim 游戏
题目
https://www.luogu.com.cn/problem/P2197
题解
经典 Nim 游戏是数学领域的公平组合数学博弈论问题,公平组合游戏具备以下特征:
- 完全性(完全信息)
- 确定性(无随机因素)
- 相同性(双方操作集合相同)
- 有穷性(有限步骤内结束)
核心理论
- 必败态(P-position):当前局面下,轮到操作的一方无论如何走,都会将对手送入必胜态。即“谁走谁输”(假设对方的应对手段不出现失误)。
- 必胜态(N-position):当前局面下,操作的一方存在一种走法,能将局面变为必败态送给对手。即“谁走谁赢”。
关键结论
对于一个 Nim 局面 \(a_1,a_2,...,a_n\),计算所有数的二进制异或和:\(value\_xor=a_1\) ^ \(a_2\) ...\(a_n\)
若 \(value\_xor == 0\),则该局面为 必败态;
若 \(value\_xor != 0\),则该局面为 必胜态。
彼之失乃吾之得是一种广义的博弈论思想,意思是对方的失误或损失,自然就是我的所得。这个思想用于作为 Nim 游戏的指导思想很恰当,Nim 游戏有时候并不能直接通过选择让自己胜利,但是可以通过让对方陷入不利的局面(有可能直接是必败态)来达成目的,对方失败就是自己胜利。
参考代码
#include<iostream>
int main() {
std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);
int T, n, m, a;
std::cin >> T;
while (T --) {
std::cin >> n;
m = 0;
for (int i = 0; i < n; ++ i) {
std::cin >> a;
m ^= a;// 求异或
}
std::cout << (m ? "Yes\n" : "No\n");// 0为必败态,否则为必胜态
}
return 0;
}
浙公网安备 33010602011771号