poj 3840 (nim博弈)

本文深入探讨了火柴游戏中的状态分类与策略选择,详细解释了T态与S态的概念,以及不同状态下的必胜与必败策略。通过具体定理分析,揭示了如何在不同堆数与状态组合下取得胜利。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:若所有火柴数异或为0,则该状态被称为利他态,用字母T表示;否则,  为利己态,用S表示。[定理 1]:对于任何一个S态,总能从一堆火柴中取出若干个使之成为T态。这就是说从A(t)堆中取出 A(t) - x 根火柴后状态就会从S态变为T态。[定理 2]:T态,取任何一堆的若干根,都将成为S态。[定理 3]:S态,只要方法正确,必赢。 [定理 4]:T态,只要对方法正确,必败。定义:若一堆中仅有1根火柴,则被称为孤单堆。若大于1根,则称为充裕堆。定义:T态中,若充裕堆的堆数大于等于2,则称为完全利他态,用T2表示;若充裕堆的堆数等于0,则称为部分利他态,用T0表示。[定理5]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。 [定理6]:S1态,只要方法正确,必胜。若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。这样,就变成奇数个孤单堆,由对方取。由定理5,对方必输。己必胜。[定理7]:S2态不可转一次变为T0态。[定理8]:S2态可一次转变为T2态。[定理9]:T2态,只能转变为S2态或S1态。 [定理10]:S2态,只要方法正确,必胜. 综上所述, 必输态:  T2,S0  

          必胜态:   S2,S1,T0.    

  • #include <iostream>
    
    using namespace std;
    
    int main()
    {
       int cas;
       cin>>cas;
       while(cas--)
       {
           int n;
           cin>>n;
           int ans=0;
           int k=0;
           int m;
           while(n--)
           {
              cin>>m;
              if(m>1)
              k++;
              ans=ans^m;
           }
           if(k==0)
           {
               if(!ans)
               cout<<"John"<<endl;
               else
               cout<<"Brother"<<endl;
           }
           else
           {
               if(ans)
               cout<<"John"<<endl;
               else
               cout<<"Brother"<<endl;
           }
       }
        return 0;
    }
    

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值