巴什博弈问题
只有一堆 n 个石子,两个人轮流从这堆石子中取物,规定每次至少取一个,最多取 m 个。最后取光者得胜。两人均采用最优方案。
分析过程
假设双方分别为A,B;且指定A为先手。
如果是 n <= m 的情况下:
先手A一次即可取完,A必胜。
故重点讨论 n > m 的情况
当 n = m+1 时:
因为A至多取 m 颗,最少取 1 颗;在此情况下B取时必能取完,故B必胜。
此时推知 m+1 颗石子组合时,可以保证先手必败:
当A取任意 k(1 <= k <= m) 颗时,B只要取走 (m+1)-k 颗,则始终可以保证为 m+1 的倍数
因此,
当 n = k(m+1) 时:
后手B必能取得最后一颗,B必胜。
进一步可知,
当 n = k(m+1) + s ,(1 <= s <= m) 时:
先手A首轮取走 s 颗,则剩余了 k*(m+1) 颗,此时B成为先手,则A必胜。
归纳结论
归纳可知
当 n <= m 时,先手A必胜。
当 n = m + 1 时,后手B必胜。
当 n = k * (m+1) 时,后手B必胜。
当 n = k * (m+1) + s 时,先手A必胜。
可简化为后两条规律。
程序实现
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int t,n,m;
cin >> t;
for(int i = 1;i <= t;i++)
{
cin >> n >> m;
if(n % (m+1) == 0)
printf("Case %d: B win\n", i);
else
printf("Case %d: A win\n", i);
}
return 0;
}