博弈类型的题 kiki's game hdoj 2147

本文深入探讨了游戏开发领域的核心技术,包括游戏引擎、Unity、Cocos2d等,以及AI音视频处理技术的应用,如视频分割、语义识别、语音识别等。通过实例解析,为开发者提供全面的技术指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础的基础

a) 当前执行者想赢。这个是必要的,有时候题目中判别胜负的条件会与平时练习的恰好相反,此时你就应该按照题目要求思考,即在经典模型中思考当前执行者想输的策略。

b) 定义P-position和N-position,其中P代表Previous,N代表Next。直观的说,上一次move的人有必胜策略的局面是P-position,也就是“后手可保证必胜”或者“先手必败”,现在轮到move的人有必胜策略的局面是N-position,也就是“先手可保证必胜”。更严谨的定义是:1.无法进行任何移动的局面(也就是terminal position)是P-position;2.可以移动到P-position的局面是N-position;3.所有移动都导致N-position的局面是P-position我们在下文中称之为必胜点和必败点

/*kiki's game

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/1000 K (Java/Others)
Total Submission(s): 6564    Accepted Submission(s): 3913


Problem Description
Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes the checkerboard game.The size of the chesserboard is n*m.First of all, a coin is placed in the top right corner(1,m). Each time one people can move the coin into the left, the underneath or the left-underneath blank space.The person who can't make a move will lose the game. kiki plays it with ZZ.The game always starts with kiki. If both play perfectly, who will win the game?
 

Input
Input contains multiple test cases. Each line contains two integer n, m (0<n,m<=2000). The input is terminated when n=0 and m=0.

 

Output
If kiki wins the game printf "Wonderful!", else "What a pity!".
 

Sample Input
5 3
5 4
6 6
0 0
 

Sample Output
What a pity!
Wonderful!
Wonderful!

*/

//下面是本人借用别人的东西,来解决问题:

 

有一个n*m的棋盘,在右上角(1,m)的位置放了一个硬币,A和B来移动这个硬币,移动的规则是:只能向左、向左下方、下方三个方向移动硬币,每次移动一步,最后一个不能再移动的人输。首先,我们看5*3的棋盘:他的哈密顿路径为6=(5-1)+(3-1):也就是如果只允许两个人向左或向下移动的步数为6,那么先移动的人必输。不过还可以向左下方移动,但这样移动的步数最多为min(n,m)-1,也就是n和m中较小的那个数减一步。所以5*3的棋盘最多能斜左下移动2步。这样移动的其实是一个直角边为min(n,m)-1的等边直角三角形。如图:

 

再明白些:你所走的路径如果是奇数的话就前者必败,偶数时前者赢两人间隔着走,每次只可走一步!)。首先要知道向左走最多走m0=(m-1)格;向下走最多n0=(n-1)格;斜线走时,最多走min(n,m)上面的三角形是等腰的,等于走一格相当于同时n0-1 , m0-1 ,横着减少竖着减少一样多那就用n1=m1来表示走斜线时所消耗的横量、竖量。下图就是就有(n-n1)+n1=n,此时只要考虑n是奇数还是偶数,这是n > m时,反之,同样道理

  这是其中的一种情况,还有n<=m的情况

 

 //别人的东西:

#include<stdio.h>

 #include<stdlib.h>

 int main()

{

  int n,m;

   while(scanf("%d%d",&m,&n),(m||n))

   {
    int min=m<n?m:n;

    if(((m-1)+(n-1))&1||(min-1)&1)//m,n都要减一;

       printf("Wonderful!\n");
      else

         printf("What a pity!\n");
        }

return 0;

}

 

//改进上面的程序,这是我自个写的:当m和m为奇数时,Kiki必输

#include<stdio.h>
#include<stdlib.h>
int main()
{
 int m,n;
 while(scanf("%d%d",&m,&n),(m||n))
 {
  if(m&1&&n&1)
    printf("What a pity!\n");
    else
     printf("Wonderful!\n");
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值