hdu 2147 kiki's game (打表找规律奇偶性规律)棋盘沿固定方向向没有经过的方格走, 直到不能走
题目来源:
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 , 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; }