当三个博弈都没法使用时用sg函数,比如拿特定的石子,就是下面这到题
sg那一段就是相当于转化P-N,注意这里第一个点不是0点为p点,而是能拿最小的那个个数减1,比如最少拿两个,那么就剩一颗石子时就已经是p状态了
为什么要用sg[x]作为异或的数字,我猜因为它代表了有几个路线可以走。。?
没有完全懂
代码copy了大神的
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int s[110],sg[10010],n;
int SG_dfs(int x)
{
int i;
if(sg[x]!=-1)
return sg[x];
bool vis[110];
memset(vis,0,sizeof(vis));
for(i=0; i<n; i++)
{
if(x>=s[i])
{
SG_dfs(x-s[i]);
vis[sg[x-s[i]]]=1;
}
}
int e;
for(i=0;; i++)
if(!vis[i])
{
e=i;
break;
}
return sg[x]=e;
}
int main()
{
int i,m,t,num;
while(scanf("%d",&n)&&n)
{
for(i=0; i<n; i++)
scanf("%d",&s[i]);
memset(sg,-1,sizeof(sg));
sort(s,s+n);
scanf("%d",&m);
while(m--)
{
scanf("%d",&t);
int ans=0;
while(t--)
{
scanf("%d",&num);
int test=SG_dfs(num);
ans^=test;
printf("(%d) ",test);
for(int i=0;i<=num;i++)
printf("%d ",sg[i]);
printf("\n");
}
if(ans==0)
printf("L");
else
printf("W");
}
printf("\n");
}
return 0;
}