S-Nim POJ - 2960

本文详细介绍了一个基于博弈论的游戏编程实现,通过使用C++语言和多种数据结构,如数组、链表、队列等,实现了一个复杂的博弈游戏。文章首先定义了游戏的基本规则,包括可以取走的石子个数,然后通过计算SG函数值来判断游戏的胜负。此外,还介绍了如何使用Mex函数求解游戏中未出现的最小非负整数,以及如何通过输入石子数量来获取游戏结果。

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

/************************************************
┆  ┏┓   ┏┓ ┆
┆┏┛┻━━━┛┻┓ ┆
┆┃       ┃ ┆
┆┃   ━   ┃ ┆
┆┃ ┳┛ ┗┳ ┃ ┆
┆┃       ┃ ┆
┆┃   ┻   ┃ ┆
┆┗━┓    ┏━┛ ┆
┆  ┃    ┃  ┆      
┆  ┃    ┗━━━┓ ┆
┆  ┃  AC代马   ┣┓┆
┆  ┃           ┏┛┆
┆  ┗┓┓┏━┳┓┏┛ ┆
┆   ┃┫┫ ┃┫┫ ┆
┆   ┗┻┛ ┗┻┛ ┆
************************************************ */
#pragma warning (disable:4996)
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<cstdlib>
#include<functional>
using namespace std;
typedef  long long ll;
#define INF 0x3f3f3f3f
const int maxn = 1e4 + 10;

//f[]:可以取走的石子个数  
//sg[]:0~n的SG函数值  
//mex[]:mex{}  
int f[maxn], sg[maxn], mex[maxn];
void getSG(int n,int k)
{
	int i, j;
	memset(sg, 0, sizeof(sg));
	for (i = 1; i <= n; i++)
	{
		memset(mex, 0, sizeof(mex));
		for (j = 1;j<=k && f[j] <= i ; j++)
			mex[sg[i - f[j]]] = 1;
		for (j = 0; j <= n; j++)    //求mes{}中未出现的最小的非负整数  
		{
			if (!mex[j])
			{
				sg[i] = j;
				break;
			}
		}
	}
}
//int pile[maxn];
int main()
{
	int k;
	while (scanf("%d", &k) && k)
	{
		for (int i = 1; i <= k; i++) scanf("%d", &f[i]);
		sort(f+1, f + k+1);
		getSG(10000, k);
		int m;
		scanf("%d", &m);
		for (int i = 1; i <= m; i++)
		{
			int ans = 0;
			int p;
			int nmax = 0;
			scanf("%d", &p);
			for (int j = 0; j < p; j++)
			{
				int x;
				scanf("%d", &x);
				ans ^= sg[x];
				
			}
			
			if (ans) printf("W");
			else printf("L");
		}
		printf("\n");
	}
	return 0;
}

注意f[]数组要排序,然后getsg函数里面的第二层循环有j<=k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44508514

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值