双人取牌问题研究(谁取最后一张谁赢)
一、名称定义
①堆张:多少堆,每堆多少张
②堆张的数学表示法(牌不分左右顺序,该表示法按左小又大排序只是为了便于讨论):
(2,3)表示两堆牌,一堆2张,一堆3张。
(1,2,3)表示三堆牌,一堆1张,一堆2张,一堆3张
③先手必胜堆张:如(1,2,4),先取成(1,2,3)
先手必败堆张:如(2,2),(1,2,3)
先手不能决堆张:先手不能决定胜负的堆张
④堆张总集合:(X1,X2,X3...) 表示任意堆,任意张
两堆牌总集合:(X,Y) 表示两堆,任意张。(2,2)属于这个集合,(36,89)也属于这个集合
三堆牌总集合:(X,Y,Z)
二、研究问题
①是否存在先手不能决堆张?
答案:不存在
反正法:假设存在一个(x1,x2,x3...)的先手不能决胜负堆张,当我取完若干张后,这时堆张为以下三种情况;
1 先手必胜堆张 2 先手必败堆张 3 先手不能决堆张
如果为1,则原堆张为先手必败堆张;如果为2,则原堆张为先手必胜堆张;如果为3,这时情况略微复杂一些,假设
先手不能决堆张取完一次后仍为先手不能决堆张,可以再取一次,先手不能决堆张→先手不能决堆张→...→先手不能决堆张
这个过程不是无限的,因为牌的总数不为无限,最后一张牌总会被取完,所以证明不存在先手不能决堆张。
由此推出:堆张总集合 = 先手必胜堆张集合 + 先手必败堆张集合
②给出堆数,求解先手必败堆张集合(先手必胜集合为必败堆张中某堆加N张即可)?
一堆牌,先手必败堆张集合:无
两堆牌,先手必败堆张集合:(X,X)
三堆牌,先手必败堆张集合:
(1,2,3)(1,4,5) (1,6,7) (1,8,9)。。。
(2,4,6)(2,5,7)(2,6,8)(2,7,9)(2,8,10)(2,9,11)(2,10,12)。。。
(3,4,7)(3,5,6) (3,7,8) (3,9,10)。。。
(4,5,9)(4,6,10)(4,7,11)(4,8,12)。。。
。。。
公式我还没推导出来,但也发现必败堆张有以下规律:
1 很容易发现除了第3排以外,基本都是x1+x2=x3
2 3堆牌数总和都为偶数
3 某一必败堆张在两堆牌中分别加一张构成了新的必败堆张,如(2,4,6)→(3,4,7)
结论:
不妨设x1<=x2<=x3
若x1+x2=x3 若(x2+x3-5)%4=0 减5除以4,是否能除尽。若能,先手必败,若不能,先手必胜。
若x1+x2 !=x3 则x1+x2+x3=偶数,先手必败;则x1+x2+x3=奇数,先手必胜
也就是说,开始了的数字就注定了最后的输赢结果。
1)两堆的情况,若等则 先手必败,不等的情况,先手必胜,因为转化成等的情况
2)三堆的情况,看x2 和x3 若相等,直接拿掉x1堆,好办。若x2和x3不等,怎么办呢,x1 又存在。我们知道(1,1,1)先手必胜
3)(1,2,3)先手必输的原因就是无论怎么拿,拿掉1堆也好,只剩两堆,而且不等,再拿一个(或者几个),使相等,那么先手就输了
若2 拿1个,或3拿1个,又可以转化成相等,必输
1)两堆的情况,若等则必败
2)三堆的情况 (1,2,3)先手必输的原因就是无论怎么拿,拿掉1堆也好,只剩两堆,而且不等,再拿一个(或者几个),使相等,那么先手就输了
若2 拿1个,或3拿1个,又可以转化成相等,必输
(1,2,3)→(1,2,1) 或(1,2,2)或(1,1,3) 都有相等的情况出现,故也必输
(0,1,2)或,0,1,3 )或,0,2,3)都不等,必输
说白了,终极判断条件就是。如果x1 x2 x3 有相等的情况 则其必输
初始化的时候,先判断三个,若有两个相等,则先手必输
最终条件就是:判断(0,0,0)为谁拿之后的状态,谁就赢
你拿多少个,我就拿多少个,这是每个人的判断标准(只有这一堆里不出现0,1,2,3)或者同时出现 2,3才来判断即可
先手必输的例子
1,5,6 先手胜,1,6,7 先手败。。故先手必胜 1 101 200 →1,100,101 →1,6,100→1,6,7→1,5,7→1,4,5→
→1,7,100 →1,6,7
→1,8,100 → 1,8,9
→1,21,100 →1,20,21
3,50 ,100 先手胜 3,50 ,100 →3,50,53 →3,20,50 →3,20,23 →3,6,23 →3,6,9,→3,6,7 →3,4,7→(3,1)(3,2)都输
2,5,6 先手必胜吗? 2,5,6 →2,4,5 1 个,两个,三个,四个都不好 故必胜
除了这些搭配,其余都是先手必胜。因为它可以转化这种例子
(1,1,2)(1,2,2)(1,2,3)(1,4,5) (1,6,7) (1,8,9)。。。
(2,4,6)(2,5,7)(2,6,8)(2,7,9)(2,8,10)(2,9,11)(2,10,12)。。。
(3,4,7)(3,5,6)(3,6,9) (3,7,8) (3,9,10)。。。
(4,6,10)(4,7,11)(4,8,12)。。。
最后结论:
初始化的时候,①先判断三个,若有两个相等,则先手必胜。因为可以直接拿掉另外一堆牌。
②若没有相等的时候,不妨设x1
ii)若x1+x2=x3 ①若X1为奇数1时,x2是偶数时,则先手必败
iii)若x1+x2=x3 ②若X1为其他奇数时,则先手必败