首页 > 试题广场 >

请问现在谁会获胜?

[单选题]
有3堆火柴,分别有3,9,12根,两个人依次取火柴,每次只能取同一堆的火柴,最少拿一根,最多拿走堆内所有火柴,取走最后一根火柴,让对方无火柴可以取者为胜。请问现在谁会获胜?()
  • 先手
  • 不确定
  • 后手
        直白一点:如果只有两堆不一样根数,如3,9。先手第一次把多的那堆拿到和少的那堆一样,(就是拿掉6),后手随便拿多少,先手在另外一堆拿同样多就能保证赢(很简单,推一下)。那么3堆的时候,先手只需要把任意一堆拿到只剩一根,那么这堆拿完需要2次,相对于2堆来说就是每人多拿一次的区别。结果还是先手赢
============另外,题目说只能拿同样一堆如果是拿完一堆才能拿下一堆那就更简单了
发表于 2016-10-26 22:03:07 回复(0)
Nim游戏是经典的公平组合游戏(ICG),对于ICG游戏我们有如下定义:
1、两名选手;
2、两名选手轮流行动,每一次行动可以在有限合法操作集合中选择一个;
3、游戏的任何一种可能的局面(position),合法操作集合只取决于这个局面本身;局面的改变称为“移动”(move)。
4、若轮到某位选手时,该选手的合法操作集合为空,则这名选手判负。

对于第三条,我们有更进一步的定义Position,我们将Position分为两类:
P-position:在当前的局面下,先手必败。
N-position:在当前的局面下,先手必胜。

他们有如下性质:
1.合法操作集合为空的局面是P-position;
2.可以移动到P-position的局面是N-position;
3.所有移动都只能到N-position的局面是P-position。

在这个游戏中,我们已经知道A[] = {0,0,...,0}的局面是P局面,那么我们可以通过反向枚举来推导出所有的可能局面,总共的状态数量为A[1]*A[2]*...*A[N]。并且每一次的状态转移很多。
虽然耗时巨大,但确实是一个可行方法。

不过,对于这个游戏有一个非常神奇的结论:

对于一个局面,当且仅当A[1] xor A[2] xor ... xor A[N] = 0时,该局面为P局面。

利用这个结论来解题: 
3 ^ 9 ^ 12= 6,  而6 != 0。 所以先手为N局面,先手胜。

对于这个结论的证明如下:
1. 全0状态为P局面,即A[i]=0,则A[1] xor A[2] xor ... xor A[N] = 0。
2. 从任意一个A[1] xor A[2] xor ... xor A[N] = k != 0的状态可以移动到A[1] xor A[2] xor ... xor A[N] = 0的状态。由于xor计算的特殊性,我们知道一定有一个A[i]最高位与k最高位的1是相同的,那么必然有A[i] xor k < A[i]的,所以我们可以通过改变A[i]的值为A[i]',使得A[1] xor A[2] xor ... xor A[i]' xor ... xor A[N] = 0。
3. 对于任意一个局面,若A[1] xor A[2] xor ... xor A[N] = 0,则不存在任何一个移动可以使得新的局面A[1] xor A[2] xor ... xor A[N] = 0。由于xor计算的特殊性,我们可以知道,一定是存在偶数个1时该位置的1才会被消除。若只改变一个A[i],无论如何都会使得1的数量发生变化,从而导致A[1] xor A[2] xor ... xor A[N] != 0。
以上三条满足ICG游戏中N,P局面的转移性质,所以该结论的正确性也得到了证明。


发表于 2015-10-25 22:58:34 回复(10)

采取的是特例分析法,可以采取以每次最少取一根的胜负结果这种特例来分析,

分析如下,首先按照取火柴的堆的顺序来看

堆的单双决定了这个堆决定两个人中的哪个获胜,

设甲乙两人,甲先手,乙后手

如果堆的顺序是 单单双(3.9.12; 9,3,12)

单堆--> 甲乙甲

单堆--> 乙甲乙

双堆--> 甲乙甲乙(最后甲没有火柴可拿)


如果堆的顺序是 双单单(12,3,9 ; 12,9,3)

双堆--> 甲乙甲乙

单堆--> 甲乙甲

单堆--> 乙甲乙(最后甲没有火柴可拿)


如果堆的顺序是 单双单(3,12,9 ; 9,12,3)

单堆 --> 甲乙甲

双堆 --> 乙甲乙甲

单堆 --> 乙甲乙(最后甲没有火柴可拿)

发表于 2015-10-26 15:02:25 回复(2)
(对题目条件理解错误,下述分析当然就不正确了。题中“每次只能取同一堆的火柴”,并不是说把其中一堆取完才能取另一堆。
因为先手有必胜策略,所以是先手胜。
先手取任取一堆,只留下一根火柴,则后手必须取那剩下的一根。
先手再取另一堆,同样只留下一根,后手也只能取走剩下的一根。
最后先手取走最后一堆所有火柴。
必胜。
编辑于 2018-06-03 16:13:51 回复(3)
第一手把任意一堆拿的只剩一根,第二手把任意一堆拿的只剩一根就赢了。
发表于 2019-10-21 00:44:37 回复(0)
这题问得不对啊,应该问哪个能确保自己获胜。我先拿我就是要输谁也管不住啊。
发表于 2018-03-22 10:52:57 回复(0)
3 异或9异或12= 6
3=0011
9=1001
12=1100
3 xor 9=1010
1010 xor 1100=0110=6
死记硬背公式吧(具体步骤太难理解)
发表于 2018-03-09 15:40:06 回复(0)
我想说一切皆有可能
发表于 2018-02-25 12:11:27 回复(0)
可以把问题简化,把三堆火柴看成是1,1,2。先手拿掉2中的一根火柴,变成1,1,1。这样先手就稳操胜券了。
发表于 2017-12-16 22:51:17 回复(0)
如果甲想故意让乙赢?甲先取
比如第一堆的时候:甲2乙1
第二堆:甲5乙1
第三堆:甲8乙1

应该c
发表于 2017-08-26 09:53:29 回复(0)
首先:跟堆的单双没有关系,只要堆中火柴数不小于3,几根都是一样的。
推理过程:
怎样会输呢?唯一的情况:给对方只剩下一堆的时候。
然后开始考察双方的行动——
第一步先手会怎样?唯一的可能:将某堆全部拿走。(其他的行动方式,都失去了“先手”的意义,跟后手没区别)
第二步后手会怎样?尽量留下两堆(比如少拿点),不要输,也就是不要给先手只剩下一堆。
那么在只剩两堆的情况下,后手有可能制造不给先手剩下一堆的情况么?没可能。

发表于 2017-08-23 16:46:14 回复(0)
如果先手是个笨蛋呢,最后一次拿到只剩下一根,这样后手就赢了啊。。。
发表于 2017-08-22 13:43:38 回复(0)
先手每次去x-1根,剩下一根你必须拿,最后一堆,我全拿走,中不中
发表于 2017-07-28 10:48:37 回复(0)
先手只要前两堆拿的只剩一个,最后一堆全拿就必胜,
发表于 2017-05-10 15:13:58 回复(0)
看评论说的好复杂  我的想法就是  前面的几堆先手一次拿走只留一根 后手就只能拿那一根  最后一堆全部拿走 后手就没的拿  所以先手必胜  还是我的理解有问题  感觉这题目题意好模糊 每次只能取同一堆火柴到底几个意思
编辑于 2017-04-22 17:02:47 回复(2)
这个题的先手必胜策略应该是为:
  1. 首先拿走任意一堆所有的火柴,因为两堆数量不同的火柴棒是先手必胜的(当然,两堆数量相同的火柴棒是先手必输的,策略见4)
  2. 然后后手取某堆n个火柴(至少剩一个),先手拿走火柴数较多的一堆的若干个是的两堆火柴数相等;
  3. 如果后手取了某堆的所有火柴,先手把第三堆全部拿走获胜;
  4. 当有两堆火柴数相等时,对方拿几个你就对应的在另一堆拿几个,那么,你肯定可以拿到最后一个。
发表于 2016-10-23 16:54:40 回复(0)
有没有更清楚一点的解释啊?
发表于 2015-10-25 21:18:13 回复(0)
A
发表于 2015-10-24 13:22:55 回复(0)