zoukankan      html  css  js  c++  java
  • CF36D New Game with a Chess Piece

    巴什博弈好题。

    如果没有跳 (k) 格的操作,根据奇偶性就可以得到答案。

    发现无论 (k) 是多少,用一次肯定扭转状态(相当于走了偶数次)。

    那无非就是不用操作赢的人想将操作次数控制为偶数,不用操作输的人想将操作次数控制为奇数。

    拿想改变状态的先手举例:

    • 如果跳一次后对手不能跳了,就赢了。
    • 如果各跳一次后自己不能跳了,就输了。
    • 如果自己不跳对手跳循环两次后自己不能跳了,也输了。
    • 如果自己不跳对手跳再自己跳对手不跳后自己不能跳了,也输了。

    但问题是判断后手到底能不能跳。对于后两种情况,可以发现两次都是 (k+1)

    从这里我们可以归纳出一种策略,即对手跳,自己就不跳;对手不跳,自己就跳。

    对于跳 (lfloorfrac{min{n-1,m-1}}{k+1} floor) 次能赢的人来说,他只要按这个策略操作,就可以获得胜利!

    但其实有很多细节。

    如果先手想要按这个策略操作,那他第一次到底是走还是跳呢?

    • (min{n-1,m-1}mod(k+1)=0),第一次跳即可。
    • (min{n-1,m-1}mod(k+1)>0),第一次走即可。

    如果后手想要按这个策略操作,先手有机会扭转局势!

    • (min{n-1,m-1}mod(k+1)=k),先手第一次跳。

    但这样交上去会 WA,观察数据再随便找找可以发现 (k=1)(n=m=3) 的时候会输出 + 而答案是 0

    (min{n-1,m-1}=d(k+1))。先手第一次跳后实行策略,接下来的 (d-1) 轮每轮和都是 (k+1)。最后剩下 (1),当 (k>1) 时先手是不能跳的,而 (k=1) 时可以。我们正是忽略了这个问题。

    所以特判 (k=1) 即可。具体地:

    • (n-1,m-1) 均是偶数。如果先手走,后手就在同一维走;如果先手跳,后手就跟着跳。先手必败。
    • (n-1,m-1) 存在至少一个奇数。如果两个都是奇数,就跳,否则走奇数那一维,这样就变成上一种情况。先手必胜。

    补充一个小疑点,为什么 (k>1) 较大的那一维的影响仅仅在于奇偶性?

    考虑先手走了较大的那一维,如果后手再走那一维仍然不会改变大小关系,那么显然正确。如果改变了大小关系,那此时两维大小相等,同时小的那维没有改变,相当于扭转了先后手,同样正确。(k=1) 的情况说白了也是如此。

  • 相关阅读:
    Javascript:三个函数ceil()、floor()、round()的区别
    一次搞懂建模语言UML
    firewalld 指定IP访问某端口
    Java通过图片url地址获取图片base64位字符串的两种方式
    个人笔记 截止2013.05.08
    解决ie6、7 marginbottom 失效问题
    jQuery 初学
    大小不固定的图片和多行文字的垂直水平居中(转)
    border :before :after 的应用
    关于<pre></pre>标签 IE6,7下实现whitespace:prewrap;
  • 原文地址:https://www.cnblogs.com/May-2nd/p/14793417.html
Copyright © 2011-2022 走看看