zoukankan      html  css  js  c++  java
  • 双人取牌问题

    双人取牌问题研究(谁取最后一张谁赢)

    一、名称定义
    ①堆张:多少堆,每堆多少张
    ②堆张的数学表示法(牌不分左右顺序,该表示法按左小又大排序只是为了便于讨论):
    (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<x2<x3 。 i)若x1+x2!=x3 则先手必胜。(根据先手必败的“必要条件”是x1+x2=x3 【注意是必要条件】。又根据逻辑命题的逆否命题 A推出B,则非B推出非A)
    ii)若x1+x2=x3 若X1为偶数且x2=x1+1 ,则先手必胜 若x2为偶数 则先手必败。
    ii)若x1+x2=x3 ①若X1为奇数1时,x2是偶数时,则先手必败
    iii)若x1+x2=x3 ②若X1为其他奇数时,则先手必败

  • 相关阅读:
    view加阴影和边框
    监视scrollview是否滚动到底
    (疯狂java)第二课
    (疯狂java)第一课
    iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon
    UIPanGestureRecognizer中translationInView的理解
    Btn要记得对状态进行设置
    添加navbar以及上面的左右按钮代码
    uimodalpresentationformsheet resize ios7
    Java Socket
  • 原文地址:https://www.cnblogs.com/bluewelkin/p/3476221.html
Copyright © 2011-2022 走看看