题目来源:

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

n * m 的棋盘, 开始棋子放在(1 , m)处, 沿 下, 左下, 左 三个方向移动并且没有经过的方格, 直到不能走。

打表找规律:

int dir[3][2] = { {0 , -1}, {1 , -1} , {1 , 0} } ;
int graph[1010][1010] ;
int n, m ;
int dfs(int x, int y){
    int dx, dy , i, ans;
    for(i = 0; i<3 ; i++){
        dx = x + dir[i][0] ;
        dy = y + dir[i][1] ;
        if(dx < 1 || dx > n) continue ;
        if(dy < 1 || dy > m) continue ;
        if(graph[dx][dy]) continue ;
        graph[dx][dy] = 1 ;
        ans = dfs(dx, dy ) ;
        graph[dx][dy] = 0;
        if(ans == 0) return 1;
    }
    return 0 ;
}
int main(){

    while(scanf("%d%d",&n , &m) && n && m ){
       memset(graph , 0,  sizeof(graph)) ;
       graph[1][m] = 1;
       printf("%d ,%d, %d\n" , n , m , dfs(1, m)) ;
    }

 

当 n *m 为偶数时, 先手 赢, n* m 为奇数时, 先手输。

代码如下:

int main(){

    while(scanf("%d%d",&n , &m) && n && m ){
      if( (n * m) & 1)
        puts("What a pity!");
      else puts("Wonderful!") ;
    }
    return 0;
}