hdu 2147

 

 

kiki's game

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

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!
 

/*

分析:

有三个方向(0,-1)(-1,0)(-1,-1)只要下一步的三个方向中有一个是必败点那么这个位置就是必胜点,形成一个递推关系。

*/

#include<iostream>
#include<cstdio>
using namespace std;
bool sg[2005][2005];
int dir[3][2]={0,-1,-1,0,-1,-1};

void Init()
{
    memset(sg,false,sizeof(sg));
    int i,j,k,x,y;
    for(i=2;i<=2000;i++)
        if(i%2==0)
            sg[1][i]=true;
    for(i=2;i<=2000;i++)
    {
        for(j=1;j<=2000;j++)
        {
            for(k=0;k<3;k++)
            {
                x=i+dir[k][0];
                y=j+dir[k][1];
                if(x>0 && y>0 && !sg[x][y])
                {
                    sg[i][j]=true;
                    break;
                }
            }
        }
    }
}
int main()
{
    Init();
    int n,m;
    while(scanf("%d %d",&n,&m),m+n)
    {
        if(sg[n][m])
            printf("Wonderful!\n");
        else
            printf("What a pity!\n");
    }
    return 0;
}
交上去超内存,想了下能否减少内存,不过行不通,继而想到这是一个规律题,打表30*30,显然规律出现了。

0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

AC代码:
#include<iostream>
#include<cstdio>
using namespace std; int main() { int n,m; while(cin>>n>>m,n+m) { if(n%2==0 || m%2==0) printf("Wonderful!\n"); else printf("What a pity!\n"); } return 0; }
 

posted on 2013-05-20 17:13  雄..  阅读(162)  评论(0)    收藏  举报

导航