一、介绍概念:

 P点 即必败点,某玩家位于此点,只要对方无失误,则必败;

N点 即必胜点,某玩家位于此点,只要自己无失误,则必胜。

定理:

        (1) 所有终结点都是必败点P(上游戏中,轮到谁拿牌,还剩0张牌的时候,此人就输了,因为无牌可取);

        (2)所有一步能走到必败点P的就是N点;

        (3)通过一步操作只能到N点的就是P点;

首先来玩个游戏,引用杭电课件上的:

(1) 玩家:2人;

(2) 道具:23张扑克牌;

(3) 规则:

游戏双方轮流取牌;

每人每次仅限于取1张、2张或3张牌;

扑克牌取光,则游戏结束;

最后取牌的一方为胜者

    自己画下图(N-P图)看看。

    x :  0  1  2  3  4  5  6  7  8  9  10。。。

    posP   N N  N  P N  N  N  P N   N 。。。

    所以若玩家甲位于N点。只要每次把P点让给对方,则甲必胜;

    反之,若玩家甲位于P点,他每次只能走到N点,而只要乙每次把P点让给甲,甲必败;

   hdu  2147   2188   2149   1847

二、巴什博奕(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)的倍数,就能最后获胜。

hdu  1846   

AC代码如下:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int t,n,m;
 5     scanf("%d",&t);
 6     while(t--)
 7     {
 8         scanf("%d %d",&n,&m);
 9         if(n%(m+1)==0)
10             printf("second\n");
11         else
12             printf("first\n");
13     }
14     return 0;
15 }
View Code

相关文章:

  • 2022-12-23
  • 2021-07-09
  • 2021-08-18
  • 2022-02-15
  • 2022-12-23
  • 2021-05-13
猜你喜欢
  • 2021-12-06
  • 2022-12-23
  • 2021-10-24
  • 2022-12-23
  • 2021-08-08
  • 2022-02-13
相关资源
相似解决方案