关于巴什博弈的简单介绍分析

来源:互联网 发布:qq三国79第一js万人敌 编辑:程序博客网 时间:2024/06/05 21:18

首先,先拿一个例题介绍一下巴什博弈。

http://acm.hdu.edu.cn/showproblem.php?pid=1846

像这样2人采用最优策略取石子的问题就是典型的巴什博弈的思想

假设一开始有n个石子那么n一定可以写成n=(m+1)*r+s的形式,既然这样的话,假如A先取,那么一开始A取走s个石子(s<m),之后B取走k个石子,所以说,假如A再取走m+1-k个石子,之后就剩余(m+1)*(r-1)个石子给B下一次取,也就是说如果不断取下去,最终该B取的时候还有(m+1)*1个石子,B不论拿走几个,A下一次都可以一次取完,所以说,当s=n%(m+1)中,s>0的时候,为A的必胜态

#include<stdio.h>#include<string.h>int main(){    int N,i;    int m,n;    scanf("%d",&N);    for(i=1;i<=N;i++)    {        scanf("%d%d",&n,&m);        if(n%(m+1)==0)            printf("second\n");        else          printf("first\n");    }    return 0;}

下面再看这个题

http://acm.hdu.edu.cn/showproblem.php?pid=2149

这个题的话,和上一个大同小异

同的分析,如果一开始的话,A加价s,那么B加价k,我们只需要不断加(m+1-k)的话,我们所得的加个一直会是

(m+1)*r+s,当这个值为n的时候,我们就获胜了,所以说当s>0的时候是我们的必胜态,当然,这个题还有一种特殊的情况需要我们讨论,就是当m>n的时候

#include<stdio.h>int main(){    int m,n,s,i;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n<=m)        {            for(i=n;i<=m;i++)            {                printf("%d",i);                if(i<m)                    printf(" ");            }        }        else if(n%(m+1)==0)            printf("none");        else        {            printf("%d",n%(m+1));        }        printf("\n");    }    return 0;}
关于巴什博弈的题网上还有很多,也有很多变形,感兴趣的可以多看一看,很有意思的~

0 0
原创粉丝点击