【博弈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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值