HDU 2147 kiki's game Bash Game 巴什博弈 &&HDU 1846

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

n*m的方格,起点在最右上方,要走到左下方,每一步可以向下 ,左右,或左下走

第一道博弈,还以为套数数的那个公式呢(1~23)  (N+M-2)%3==0则输掉比赛,原来那只是一个题的公式啊。囧

 

这个题是根据下面的规则画图

步骤1:将所有终结位置标记为必败点(P点);

步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)

步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;

步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。

原来规律是自己推得啊?!。。。受教了

画出图来,就发现规律了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)break;
        if(n%2&&m%2)printf("What a pity!\n");
        else printf("Wonderful!\n");
    }
    return 0;
}

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

估计是最裸的巴什博弈吧  公式  n%(m+1)==0则输 否则会赢  

第一步取走n%(m+1)个,然后根据第二个人所取数目k,跟着他取走(m+1-k)个即可。  !!!

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int main()
{
    int CASE,n,m;
    scanf("%d",&CASE);
    while(CASE--)
    {
       scanf("%d%d",&n,&m);
       if(n%(m+1)==0) printf("second\n");
       else  printf("first\n");
    }
    return 0;
}

  

 

posted @ 2012-04-24 20:52  快乐.  阅读(216)  评论(0编辑  收藏  举报