HDU 1536 S-Nim

本文分享了kuangbin关于博弈论的知识总结,并通过一道具体题目介绍了如何运用SG函数解决博弈问题。文中提供了完整的C++代码实现,展示了如何通过递归获取各堆的SG函数值并进行异或操作以判断输赢。

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

开始入手的就是博弈了,现在此推荐kuangbin写的这个博弈论总结的知识点了。帮助很大啊!!!好好学习完再做题还是可以学到不少的


这个题就是考虑的SG函数的应用,难点就是每堆看成一个子游戏,SG通过递归可以得到由k个可取集合限制下的各个堆的SG函数值,然后对之进行异或再判断是否为0即可。

这种求SG函数这几天的做题下来发现主要就是按照题目要求模拟推导,利用递归等方法或者如果数字太大了,可以考虑先打表前x个的SG函数值,找规律然后直接得出SG的表达式,这个比较取巧,但有时候也是十分可行的。



#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=110;
int k,s[maxn],m,x,h[maxn];
int sg[10010];


int mex(int n)
{
int vis[maxn]={0};

 for(int i=1;i<=k;i++)
 {
     if(n-s[i]<0)
        break;
     if(sg[n-s[i]]==-1)
     {
         sg[n-s[i]]=mex(n-s[i]);
     }
     vis[sg[n-s[i]]]=1;
 }
 for(int i=0;;i++)
 {
     if(!vis[i])
     {
         return i;
     }
 }

}

int main()
{
    while(scanf("%d",&k)!=EOF)
    {

     if(k==0)
        break;
     for(int i=1;i<=k;i++)
        scanf("%d",&s[i]);
      sort(s+1,s+1+k);
    memset(sg,-1,sizeof(sg));
    sg[0]=0;
     scanf("%d",&m);
     for(int i=0;i<m;i++)
     {
         scanf("%d",&x);
          int ans=0;
         for(int j=1;j<=x;j++)
        {
          scanf("%d",&h[i]);
          if(sg[h[i]]==-1)
            sg[h[i]]=mex(h[i]);
          ans^=sg[h[i]];
        }
         if(ans==0)
                printf("L");
         else
            printf("W");

     }
     printf("\n");
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值