在看本文章之前,请先看一下,我在B站找到的巴什博弈的视频。
巴什博弈
巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取m个。最后取光者得胜。
显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
例题
//Bash游戏
#include <bits/stdc++.h>
using namespace std;
int main(void){
int n;
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
if(a%(b+1) == 0){
//此时后手赢得比赛
cout<<"B"<<endl;
}else{
cout<<"A"<<endl;
}
}
return 0;
}
那么如果我们规定,最后取光者输,那么又会如何呢?
还有一个题目也是此题的翻版。
例题
可以依照规律来看。
设p为先手赢,n为后手应
对前几个打表得:
n: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
np态: p n p p p p n p n p p p p n p
由图可得循环点为7;
对于1,那么就是A取完就好 --A
对于2,只能是A拿一个 --B
对于3和4,都是A拿完 --A
对于5,靠向2,A取3,B只能1 --A
对于6,A取一个的话,B就是5的情况,B赢,取3个的话,B就是3的情况,B赢,取4个的话,B就是2的情况,A赢,所以A;
对于7,A取一个的话,B就是6的情况,B赢,取3个的话,B就是4的情况,B赢,取4个的话,B就是3的情况,B赢,所以B;
以此类推,对于A取多少个,对于B来说总是有之前的方案对应;
如果到这里你还有余力建议看给大家的东西:
博弈论及算法实现
SG函数和SG定理
cs