Ferguson游戏(清空分割游戏) hdu2147

这道题目意思是一个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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值