zoukankan      html  css  js  c++  java
  • 取石子游戏博弈推导

    题目:

    有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

    输入:
    输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。

    输出:
    输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。

    题解:行和列分别表示两堆石子的起始数量,0表示 遇上必输局面,1表示遇上比赢局面。用类似动态规划填表的形式推理输赢状态转换

    得到结果:0表示聪明必输状态,1表示聪明必赢状态

    分析:

    如果双方都采取最佳下棋策略,则石堆中初始石子数量就决定了选手输赢。

    假设两堆石子的数量分别为a和b,其中a>=0且b>=0。

    在二维图中第a行第b列表示:状态(a,b)

    我们已知最简单的状态:(0,0)-》必输状态0 ;(0,N+)或(N+,0)-》必胜状态

    1.状态(a,b)通过一次操作可以转换到绿色状态中的某一种,绿色状态为(a,b)的较简单状态。

    如果状态(a,b)的绿色区域(一次操作)有0,表明可以通过一次操作使对手处于必败局面,则状态(a,b)赋值为1,为必胜状态

    如果状态(a,b)的绿色区域(一次操作)无0,表明不存在可使对手处于必败局面的一次操作,任何一种操作都使对手面临必胜状态,则状态(a,b)赋值为0,为必败状态

    2.如果状态(a,b)已经确定为必败状态,那么所有可以通过一次操作转换到(a,b)的状态为蓝色区域;

    蓝色区域的状态因为可以一次操作使对方面临必败状态,所以所有蓝色区域的状态均为必胜状态

    经过推导可以得到:

    可以看到,为0的状态(a,b)有:

    0,0;1,2;2,1;3,5;4,7;5,3; 6,10; 7,4; 8,13; 9,15; 10,6; 11,18; 12,20; 13,8;  14,?;  15,9; 16,?; 17,?; 18,11; 19,?; 20,11;

    观察上面推导图发现,对于为0的状态(a,b):对于每个自然数x,x都将在a中出现一次,x都将在b中出现一次。并在出现之后分别把把x行和x列剩余状态置为1(必胜状态)。

    在为0状态(a,b)中取a<b,有:

    1,2 ;3,5;4,7;6,10;8,13,; 9,15;11,18;12,20;

    b-a为:1,2,3,4,5,6,7,8

    本题的分析用动态规划的思想填表,但是数据比较大。还是不行。

  • 相关阅读:
    Entity Framework Core 之Modeling Relational Database Modeling
    Entity Framework Core 之Modeling Relationships
    Enterprise Library6.0之缓存模块
    Entity Framework Core 之Modeling 1
    Entity Framework Core 之简单介绍
    EntityFramework6.X 之 Operation
    EntityFramework6.X 之Index/Cascade Delete
    吴立德机器学习笔记(转)
    C++基础day01类中不写成员函数易犯错误模型
    C++基础day01 类和对象的关系思考
  • 原文地址:https://www.cnblogs.com/huangzq/p/3065819.html
Copyright © 2011-2022 走看看