zoukankan      html  css  js  c++  java
  • HDU 1850 Nim-Sum思想总结、

    算法介绍:

    Nim游戏是指两个对手在m个堆中轮流随意从某一个堆中拿出n个元素,假定两个对手都是足够聪明,直至最后一次取的人将所有元素取出,此人取得胜利。与之相反的是Misere游戏,相同的游戏规则,但是最后一次取的人将落败。

    为了解决这个问题,有一个叫做nim-sum的方法加以解决,这个方法是这样的

    设有三个堆分别是 Heap A, Heap B,Heap C,每个堆分别有8,12,13个元素

    1)将每个堆的元素使用二进制表示,分别是1000,1100,1101

    2)对三个数进行异或操作,即:

    1000
    1100
    1101
    -------
    1001

    就是十进制的9,这个就是三个堆的nim-sum,如果nim-sum为0,则先手者不可能胜出

    3)使用这个计算出来的nim-sum再次分别于三个堆中元素个数进行异或操作,如果得到异或的结果小于堆数则为可选的必胜的操作,即:

    情况一:

    1000
    1001
    -------
    0001<1000,可以为必胜操作,此时先手者可以从Heap A中取出8(1000)-1(0001)=7个元素,则下一步的nim-sum为0,接下来的策略就是依照这个算法继续进行,模拟操作如下:

    HeapA  HeapB  HeapC Nim-Sum

    8              12           13             9           先手者从Heap A中拿出7个元素,使得下一步的nim-sum为0,则先手者胜出

    1              12            13            0           后手者从Heap B中拿出5个元素

    1               7             13            11          先手者从Heap C中取出13-(13^11)=7个元素

    1               7               6              0         后手者从Heap B中取出5个元素

    1               2               6              5         先手者从Heap C中取出6-(6^5)=3个元素

    1               2               3             0          后手者从Heap C中取出3个元素

    1               2               0             3          到这一步,如果是nim游戏,则在HeapB中取出1个元素(如果是misere游戏,则全取HeapB所有元素)

    1               1               0             0          后手者取出HeapA中一个元素

    0               1               0              1         先手者取出HeapB中最后一个元素,先手者胜出

    情况二:

    1100
    1001
    -------
    0101<1100,可以为必胜操作,此时先手者可以从Heap B中取出12(1100)-5(0101)=7个元素

    情况三:

    1101
    1001
    -------
    0100<1101,可以为必胜操作,此时先手者可以从Heap C中取出13(1101)-4(010)=9个元素

    分析:

    如上面8 12 13

    对情况一,三个堆可分解为

    HeapA    1    7

    HeapB   12

    HeapC   12   1

    多出元素为HeapA中的7,取出后三个堆呈现对称分布

    对情况二,三个堆可分解为

    HeapA     8

    HeapB     5      7

    HeapC     5      8

    多出元素为HeapB中的7,取出后三个堆呈现对称分布

    对情况三,三个堆可分解为

    HeapA    8

    HeapB    8     4

    HeapC    4     9

    多出元素为HeapC中的9,取出后三个堆呈现对称分布

      

    总结:

    1.可以通过计算所有堆的nim-sum得出先手者是否可以取胜,如果不是0则可以,为0则不可以

    2.可以用计算后的nim-sum分别与所有堆的元素进行异或操作,如果得到结果小于原来堆的元素,则为可选操作

    以上分析来自:http://blog.csdn.net/lawrencesgj/article/details/7828935

  • 相关阅读:
    软件是否有必要进行性能测试
    电子工业出版社博文视点在上海第六届UPA中国用户可用性大会上
    一站式学习 Linux C语言编程
    免费讲座:从草根到巨人——互联网时代的LAMP开源架构
    相忘于江湖,《监控》 来自热心读者simon
    博文视点大讲堂第18期:从草根到巨人——互联网时代的LAMP开源架构
    博文视点Open Party第8期
    都是过客,相煎何急?
    每个人心中都有一片极乐净土
    CSS单位和CSS默认值大全
  • 原文地址:https://www.cnblogs.com/sasuke-/p/5174655.html
Copyright © 2011-2022 走看看