您的位置:首页 > 其它

2177博弈问题 取石子游戏 算法

2010-01-22 09:30 253 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2177

我的解法:http://blog.csdn.net/a0210077/archive/2010/01/22/5223032.aspx

算法原帖地址:http://www.pinggu.org/html/2007-7/21/211066.html

0 0 相差0
1 2 相差1
3 5 相差2
4 7 相差3
6 10 相差4
8 13 相差5
9 15 相差6
11 18 相差7
12 20 相差8
14 23 相差9
16 26 相差10
17 28 相差11
19 31 相差12
21 34 相差13
22 36 相差14
24 39 相差15

如此至无穷,每组的小数是尚未使用过的最小的数字。

这样的堆数可以说是 “死棋” 被“将军”

当堆数在这样的数列中时,后取者胜。

在其他情况时,先取者胜,他只需把堆数取成数列中的形式即可。

原因是这样。 条件规定的两种取法的意义是 在任何一堆出现0这个数,或两堆相差为0时。先取者胜。所以从最小数和相差数两方面入手考虑。 先前的帖子也注意到1 2 是“将军”,也就是说,当两堆不是1 2时,而两堆中任一堆出现1或2,或两堆相差1时,先取者能“将军”,必胜。

在此基础上,选3(剩下的数中最小的数)做基数,加2, 得到数组 3 5. 先取者无论如何取,要么出现0,1,2,要么两堆相差数成为0,1。后取者能将军。 所以3 5也是“死棋”

所以考虑这样数对的规律。 首先需要有没使用过的数中最小的。这样对手若是在这堆中取走石子。选手可以可以从另一堆中取走石子让它变成更低阶的“死棋”形式。 比如8 13,若对手取成7 13, 我们可以取成 7 4,继续“将军”

第二个条件是相隔数目逐对递增。这样对手从数目多的堆数取走石子时,会让两堆差距缩小。进入我们的“射程”,比如9 15,对手取成9 14,我们可以同时取走1,8 13继续“将军”

当对手从数目多的堆数拿走很多石头,使两堆差距发生逆转时,这时候的调整有些不一样。比如22 36, 如果对手取成22 13,我们可以调整为8 13, 若对手取成 22 14,我们可以同取2为12 20。总能调整成功,证明比较复杂,放后面。

解法部分到此结束。

但是另外需要注意的是

这样的数对可以覆盖整个整数集合。这个显然。

需要一一对应,在这种解法中 随着数字增大,基数在增大,两堆相差也在增大。所以后面的数不会和前面的数重复,能保证一一对应。 比如8+5=13严格 <9 +6。

解法的唯一性 。解法并不唯一,比如11 7,我们可以调整为4 7 或10 6,都是“将军”。

数对的特性。 这数列有奇怪的性质,初期有些类似费波拉其数列的性质。但很不一样。 1.较小数似乎以单独一个 连续两个 为单位,以奇怪的节奏进行反复。2. 他能保证后面证明的那个性质。

最后的证明:当较大的数a变为较小数c的时候,我们有两种方法调整。 一是他们相隔较近的时候,同时取走一定数目,比如22b 14c,这时它们相距8, 14的搭档是23,22无法达到,同时取走2变成20 12,是“死棋”。 二是他们相隔较远,比如22b 11c,相距11,相距11的死棋是17 28,无法达到。所以调整为18 11。

需要证明的是这两种方法覆盖的数字没有遗漏(偶尔有重复,如11 7)。考虑a b,a>b,如22 b 在所有“死棋”数列中寻找最小的较大数,使之大于a。对22来说,是14 23这一对。也就是说,对于b为14以下的数字时,22都可以用上面的方法2调整。考虑14 23 (相隔9)的前一对 12 20(相隔8) ,也就是说相隔8以内的数字,22都可以用方法1调整。 而23>22 9-8=1是最小的相差数, 所以 14=23-9>=22-8=14。 前一个14是方法2覆盖的范围,后一个14是方法1覆盖的范围。 范围没有遗漏。即证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: