题解:AcWing 891 Nim游戏
【题目来源】
AcWing:891. Nim游戏 - AcWing题库
【题目描述】
给定 \(n\) 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
【输入】
第一行包含整数 \(n\)。
第二行包含 \(n\) 个数字,其中第 \(i\) 个数字表示第 \(i\) 堆石子的数量。
【输出】
如果先手方必胜,则输出 Yes。
否则,输出 No。
【输入样例】
2
2 3
【输出样例】
Yes
【算法标签】
《AcWing 891 Nim游戏》 #数学知识# #博弈论# #Nim游戏#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n; // 石子堆数
cin >> n;
int res = 0; // 异或结果,初始为0
// 读取每堆石子的数量
while (n--)
{
int x; // 当前堆的石子数量
cin >> x;
res ^= x; // 将所有石子数量进行异或运算
}
// Nim博弈定理:
// 如果所有石子数量的异或结果不为0,先手必胜
// 如果所有石子数量的异或结果为0,先手必败
if (res) // 如果res != 0
{
cout << "Yes" << endl; // 先手必胜
}
else
{
cout << "No" << endl; // 先手必败
}
return 0;
}
【运行结果】
2
2 3
Yes
浙公网安备 33010602011771号