朴素巴什游戏
首先给出简单的例题:
题意:
有n堆石子,甲先取,乙后取。每次可以拿1~m个石子,轮流拿下去,拿到最后一颗的人获胜。给定n和m,问你先手赢还是后手赢
分析如下:
当n<=m时,由于一次最少拿1个,最多拿m个,甲可以一次性拿完,先手赢
当n==m+1时,无论甲拿走多少个(1~m个)剩下的都多于1个,少于等于m个,乙都能一次性拿走剩下的石子,后手取胜
上面两种情况可以拓展成以下两种情况:
1.如果n%(m+1)==0,那么甲不论拿多少,设甲拿了k个,乙都拿m+1-k个,使得剩下的永远是m+1的整数倍,直到最后的m+1个,所以后手赢
2.如果n%(m+1)!=0,那么还有余数设为r,甲先拿走r个,这样就转化为n%(m+1)==0的情况且乙是先手,那么这时先手甲赢
所以在这个游戏中,先手赢的机会比后手大
Code:
#include <bits/stdc++.h>
using namespace std;
int n,m;
void solve(){
cin>>n>>m;
if(n%(m+1)==0) puts("second");
else puts("first");
}
int main(){
int T;
cin>>T;
while(T--) solve();
return 0;
}
巴什游戏变式
先给出一道例题:
题意:
两个人进行游戏
给定一个棋盘n*m,先手从右上角(1,m)出发,进行一次操作
每次操作有三种选择,往左推进一格,往下推进一格,往左下推进一格
问先手赢还是后手赢
分析如下:
为什么它属于巴什游戏变式呢,因为我们发现它就是二维的巴什游戏
对于一些简单博弈,我们只需画出PN图然后找规律即可
对于画PN图的步骤:
步骤1:将所有终结位置标记为必败点(P点);
步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)
步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;
步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。
因此我们可以画出这样的PN图:
然后去找规律
我们发现标记为'P'的格子的特点是n和m至少有一个是偶数
因此当n和m中至少有一个为偶数时,先手必胜