Bash遊戲 (簡單博弈)
假設一個石子堆有n個石子,每次最多隻能取m個,zzx和whl兩位大神準備進行競賽,兩位大神每一步走的都是最優的。zzx大神先開始,最後把石子取完的人獲勝,作為旁觀者的你能不能告訴我們,是zzx大神贏了,還是whl大神贏了?
實現程式碼:
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
int n,m;
int t;
scanf("%d", &t);
while(t--) {
scanf("%d %d", &n, &m);
if (n%(m+1)==0)printf("second\n");
else printf("first\n");
}
return 0;
}
這種型別的博弈稱作BashGame。
假設剛剛開始n=m+1,那麼第二個取的人必勝。那麼我們有如下結論:
令
n=(m+1)*r+s
其中(r>1,0<=s<m+1)
。如果s=0的話,先手每次取k個,後手只要取(m+1-k)個即可,後手必贏。如果s!=0的話,先手者第一次取s個,後手第一次取k個,接下來先手只要取(m+1-k)個即可,先手必贏。