巴什博弈(Bash Game)

来源:互联网 发布:淘宝店铺基本设置在哪 编辑:程序博客网 时间:2024/06/07 23:34

巴什博弈(Bash Game)

          一堆有n个的石子,A、B两人轮流从中取石子,游戏规定每人每次至少取一个至多取m个,最终取完石子的人取胜。

         该类问题,直接寻找必败态。如果这堆石子小于或等于m个(即n<=m),那么先取的人一定赢,他一次便可取完所有石子;如果这堆石子等于m+1个,那么无论第一个人去多少,他都不可能一次取完石子,而第二个人则可以一次取完剩下的所有,则先手一定输;如果这堆石子数目为m+1<n<2(m+1),那么先手就可以取走n-(m+1)个石子,使得对手面对m+1的必败态,则先手一定赢。按此推导下去可以发现:如果这堆石子的数目为n=(m+1)r+s(r为任意正整数,s为整数并且s<=m),那么先手只需取走s个石子,如果后手取走k(k<=m)个石子,那么先手再取走m+1-k个,石子剩下(m+1)(r-1)个,先手以后保持这样地取法,那么先手一定赢。

结论如下:当n%(m+1)==0时,先手输,否则后手输。

对应代码如下:

//c代码#include<stdio.h>int main(){    int n,m;    scanf("%d%d",&n,&m);    if(n%(m+1)==0)        printf("first\n");    else        printf("second\n");    return 0;}
//c++代码#include<iostream>using namespace std;int main(){    int n,m;    cin>>n>>m;    if(n%(m+1)==0)        cout<<"first"<<endl;    else        cout<<"second"<<endl;    return 0;}


0 0