这道题目意思是一个n*m的棋盘,从右上角开始,每次只能向紧邻的左,下或左下移动,不能移动的人输。
这道题目类似Ferguson游戏。先介绍下Ferguson游戏。
有两个盒子,一开始其中一个有m颗糖,另一个有n颗糖(我们把它记为[m][n]),每次移动将一个盒子清空,把另一个盒子中的若干糖果拿到被清空的盒子中,要保证每个盒子中至少有一颗糖。
显然[1][1]是唯一的终态。它的结论是当m和n都为奇数时,先手必败,否则,先手就能找到必胜的策略。
为了证明这个结论。需要证明三个命题。
A:两个盒子都是奇数的状态移动不到两个盒子都为奇数的状态。
B:至少有一个盒子是偶数的状态可以移动到两个盒子都是奇数的状态。
C:终态是两个盒子都是奇数(显然是)。
对于A命题,一个奇数只能分成一个偶数和一个奇数的和。则不论清空那个盒子中的糖果,另一个盒子都是奇数,再分开也得不到两个盒子都是奇数的状态。
对于B命题,一个偶数可以分成两个奇数的和。则我们只需要将一个偶数盒子的分开就可以得到两个盒子都是奇数的状态。
这样,我们就证明了这个结论。
回到正题,对于这个题目,题目中给的坐标有点儿坑,我们将左下角定为坐标(1, 1),则右上角就是(n,m),这样,我们就可以用同样的方法分析了。
有趣的是它的结论和Ferguson游戏一样,很容易证明。
#include <cstdio>
int main(void)
{
int n, m;
scanf("%d%d", &n, &m);
while (n != 0 || m != 0) {
printf("%s\n", !(n % 2 == 1 && m % 2 == 1) ? "Wonderful!" : "What a pity!");
scanf("%d%d", &n, &m);
}
return 0;
}