初识巴什博弈

  前几天想做2149,想了很长时间,终于自己弄了一个规则,结果总是WA,不得已查了一下,才发现果然只是一个规则,一个公式,偏偏自己没想出来,原来这是著名的巴什博弈问题,下面从百度百科中剪下其简单的介绍,基本能说明问题,最起码我看明白了哈哈。

  巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

  显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

  嗯,看着挺有道理的,就是自己怎么就没推出来呢?

View Code
 1 # include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 int M,N;
7 int temp,count;
8 while(scanf("%d %d",&M,&N)!=EOF){
9 count = 0;
10 for(int i = 1;i <= N; i++){
11 if((M<=N&&i>=M)||(M-i)%(N+1)==0){
12 if(!count)
13 printf("%d",i);
14 else
15 printf(" %d",i);
16 count++;
17 }
18
19 }
20 if(!count)
21 printf("none\n");
22 else
23 printf("\n");
24 }
25 getchar();
26 return 0;
27 }


 

posted on 2012-03-21 21:23  eaglet90  阅读(423)  评论(0)    收藏  举报