首先,先拿一个例题介绍一下巴什博弈。
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;
}
关于巴什博弈的题网上还有很多,也有很多变形,感兴趣的可以多看一看,很有意思的~