【博弈SG函数】新尼姆堆游戏


大致思路

这道题就是典型的讲解中提到的“每次取石子的数量是不连续的”,那么就用模板——打表法。

就是模板题。


代码

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

int S[105];
int sg[105];
const int maxc=10005;
int vis[maxc];
int n;
void getsg()  //打表法 
{
	for(int i=1;i<=maxc;i++)  //对于石子数为1 2 3...maxc的一堆石子,sg值分别是多少 
	{
		memset(vis,0,sizeof(vis));
		for(int j=1;S[j]<=i&&j<=n ;j++)
		{
				vis[sg[i-S[j]]]=1;  //后续 
		}
		for(int k=0;k<=maxc;k++)
		{
			if(vis[k]==0)
			{
				sg[i]=k;
				break;   //之前一直卡,发现错因在忘了写break T T 
			}
		}
	}
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&S[i]);
	}
	sort(S+1,S+n+1);
	getsg(); 
	int m;
	cin>>m;
	while(m--)
	{
		int d;
		scanf("%d",&d);
		int ans=0;
		for(int i=1;i<=d;i++)
		{
			int c;
			scanf("%d",&c);
			ans^=sg[c];
		}
		if(ans==0)
			cout<<"L";
		else
			cout<<"W";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_38033475/article/details/80274557