zoukankan      html  css  js  c++  java
  • HDU 3389 (Nim博弈变形) Game

    参考了众巨巨的博客,现在重新整理一下自己的思路。

    首先在纸上画了一下转移图:

    1 3 4号盒子是不能够再转移卡片到其他盒子中去了的,其他盒子中的卡片经过若干步的转移最终也一定会转移到1 3 4号盒子中去。

    具体来说,n % 6 == 0 或 2 或 5的盒子,经过奇数步转移到1 3 4中去,其他的则须经过偶数步才能转移过去。

    下面来证明,所有卡片都在偶数步盒子中是必败状态

    因为不论先手将偶数步的盒子中卡片移走了多少,后手一定可以把这些卡片再往前移动一个盒子,直到移到1 3 4中去为止。

    对于只有一个盒子有卡片,而且这个盒子是奇数步盒子来说,先手必胜

    很简单,根据上面的结论,只要先手把这个奇数步盒子中所有卡片全部往下移一个盒子就好了。这样就转移到了先手必败状态。

    整个游戏可以看做若干个子游戏的和游戏,偶数步盒子不予考虑,只考虑奇数步盒子中的卡片,这就相当于一个n堆石子的Nim游戏。

    在一个奇数步盒子中移走k张卡片,相当于在某一堆石子中取走k个石子。把所有石子取完相当于,所有的卡片都在偶数步的盒子里面,而我们已经证明完这种状态是必败状态了。

    所以在代码中就只需要将奇数步盒子中的卡片数异或一下求个Nim和,就能判断胜负了。

     1 #include <cstdio>
     2 
     3 int main()
     4 {
     5     //freopen("in.txt", "r", stdin);
     6 
     7     int T; scanf("%d", &T);
     8     for(int kase = 1; kase <= T; kase++)
     9     {
    10         int n; scanf("%d", &n);
    11         int a, sum = 0;
    12         for(int i = 1; i <= n; i++)
    13         {
    14             scanf("%d", &a);
    15             if(i%6==0 || i%6==2 || i%6==5) sum ^= a;
    16         }
    17         printf("Case %d: %s
    ", kase, sum ? "Alice" : "Bob");
    18     }
    19 
    20     return 0;
    21 }
    代码君
  • 相关阅读:
    ok~加油!
    解析window.open链接的参数
    Arrya数组添加过滤条件
    Oracle 查询今天、昨日、本周、本月和本季度的所有记录
    Sql Server日期查询-SQL查询今天、昨天、7天内、30天
    Lua 中 pairs 和 ipairs 的区别
    关于SignalR连接数量问题的记录
    IceStorm示例运行步骤
    从 OPC 到 OPC UA
    SQL Server 2008 R2 Express Profiler
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4455908.html
Copyright © 2011-2022 走看看