博弈论——AB博弈
题目
解法:
这是一道博弈论类型的题目,关键在于分析在不同初始数字下,A、B 两人采用最佳策略时谁能将数字减为 0 。
分析解题的步骤
-
考虑每次操作可以减 1 或者减 2 ,我们从简单情况入手分析。若初始数字为 1 ,A 减 1 就可将数字变为 0 ,A 获胜;若初始数字为 2 ,A 减 2 也能将数字变为 0 ,A 获胜。
-
当初始数字为 3 时,若 A 减 1 ,剩下 2 ,B 减 2 就把数字变为 0 ;若 A 减 2 ,剩下 1 ,B 减 1 把数字变为 0 ,所以 B 获胜。
-
当数字为 4 时,A 减 1 ,剩下 3 ,此时 B 面对 3 ,按照前面分析 B 会输,A 会赢;A 减 2 ,剩下 2 ,A 也会赢。
-
当数字为 5 时,若 A 减 1 ,剩下 4 ,B 操作后 B 会赢;若 A 减 2 ,剩下 3 ,B 操作后 B 也会赢。
5. 通过以上分析可以发现规律:若初始数字 N=n + 1 除以 3 的余数为 1 或者 2 ,A 可以通过合理操作(余数为 1 时减 1 ,余数为 2 时减 2 ),使得剩下的数字能被 3 整除,然后 B 操作后,A 再操作又能让剩余数字保持被 3 整除,这样最终 A 能把数字减为 0 ;若初始数字 N=n + 1 能被 3 整除,A 操作后,B 可以通过操作让剩余数字保持被 3 整除,最终 B 能把数字减为 0 。
代码实现(以 Python 为例)
while True:
try:
n = int(input())
N = n + 1
if N % 3 == 0:
print("PangPang will get the gold nugget!")
else:
print("Brother Chao will get the gold nugget!")
except:
break
代码实现(以 C++ 为例)
#include <iostream>
using namespace std;
int main() {
int n;
while (cin >> n) { // 持续读取输入,直到输入结束(比如遇到文件结束符等情况)
int N = n + 1;
if (N % 3 == 0) {
cout << "PangPang will get the gold nugget!" << endl;
} else {
cout << "Brother Chao will get the gold nugget!" << endl;
}
}
return 0;
}
总结
通过对不同初始数字下操作策略的分析,找出了根据初始数字 N=n + 1 除以 3 的余数情况来判断 A 或 B 谁能获胜的规律,并通过代码实现了多组数据的输入和结果输出。