博弈论

开博!!!

取石头问题:取石子总结(博弈)_

 

关键点的结论: 

  • min博弈:^的结果为0, 先手输,不然赢(最后一个取完的人获胜);
  • 先手能找到必输的情况 必赢,反之就输。
  • 维持不变原则,然对方一直处于必败

 

SG函数 :

  • 核心思路:利用SG来将问题转换为Min问题。
  • 处理的时候就是 把sg看成一个有向图,这个点可以又哪些点进行更新过来,取集合中所没有的非负的最小数,以保证,我这个点可以选着任意个数(转化为取石头问题)
  • 注意一些,特殊点,terminal point 等等,0(代表先手必输)
  • 在转移的时候,更具题目的特殊要求,有一些点是不能转移的,要特判(转移过整个游戏就输了)
  • 对于一些很多种条件的博弈,一样可以转化为多个图的sg来进行Min,拆分的思想。

代码:

void inint(){
    
    sg[0][0]=0;
    for(ri i=1;i<=100;i++)
    {
        for(ri j=1;j<=100;j++)
        {
            枚举每一个点,
           

            for(ri k=0;k<=200;k++)
            {
                flag[k]=0; 清零
            }
                     在对这个点进行进行更新,看哪些点可以到达他
            for(ri k=1;i-k>=1;k++)
            {
                if(i-k==j) continue;
                flag[sg[i-k][j]]=1;
            }
            for(ri k=1;j-k>=1;k++)
            {
                if(i==j-k) continue;
                flag[sg[i][j-k]]=1;
            }
            for(ri k=1;j-k>=1&&i-k>=1;k++)
            {
                flag[sg[i-k][j-k]]=1;
            }
                        来确定sg的值
            for(ri k=0;;k++)
            {
                if(!flag[k])
                {
                    sg[i][j]=k;
                    break;记住break
                }
            }
        }
    }
    
}
View Code

 

posted @ 2022-04-12 21:09  VxiaohuanV  阅读(79)  评论(0编辑  收藏  举报