S-Nim HDU 1536 博弈 sg函数
时间:2019-10-19
本文章向大家介绍S-Nim HDU 1536 博弈 sg函数,主要包括S-Nim HDU 1536 博弈 sg函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
S-Nim HDU 1536 博弈 sg函数
题意
首先输入K,表示一个集合的大小,之后输入集合,表示对于这对石子只能去这个集合中的元素的个数,之后输入 一个m表示接下来对于这个集合要进行m次询问,之后m行,每行输入一个n表示有n个堆,每堆有n1个石子,问这一行所表示的状态是赢还是输,如果赢输入W否则L。
解题思路
如果没有每次取石子个数的限制的话,那么仅仅需要把每堆石子的个数进行异或运算即可,如果结果不是1,那么先手赢,反之后手赢。
但是这里对每次取石子的个数进行了限制,每次只能从几个数中进行选择,这是就需要SG函数来进行处理了。至于为什么要使用SG函数来进行处理这里没有写,详细可以参考这个博客博弈论 SG函数
这里仅仅写了SG函数的两种写法:1是打表法,2是DFS法。
代码实现
//打表法实现
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e4+7;
int sg[maxn];
bool book[maxn];//这个需要用bool类型,如果改成int类型会超时,第一次遇到。
int s[107];
int k, m, l;
void getsg(int n, int k)//n代表这堆石子最多有多少,k代表有多少种取的模式
{
int i, j;
memset(sg, 0, sizeof(sg));
for(i=1; i<=n; i++)
{
memset(book, 0, sizeof(book));//每次有需要进行
for(j=1; j<=k && s[j]<=i; j++)
book[sg[i-s[j]]]=1;
for(j=0; ; j++)//查找里面第一个是0的
if(!book[j])
{
sg[i]=j;
break;
}
}
}
int main()
{
while(scanf("%d",&k) && k)
{
for(int i=1; i<=k; i++)
scanf("%d",&s[i]);
sort(s+1, s+1+k);
getsg(maxn-7, k);
scanf("%d",&m);
while(m--)
{
scanf("%d", &l);
int tmp, ans=0;
while(l--)
{
scanf("%d", &tmp);
ans^=sg[tmp];
}
if(ans==0)
printf("L");
else
printf("W");
}
printf("\n");
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10050+7;
int s[105];
int SG[maxn];
bool book[105];
int k, m, l;
int sg(int x)
{
if(SG[x]!=-1) return SG[x];//记忆化搜索
memset(book, 0, sizeof(book));
for(int i=1; i<=k && x-s[i]>=0; i++)
book[sg(x-s[i])]=1; //寻找他的下面的所有状态
for(int i=0; i<105; i++) //找到第一个是0的位置
if(book[i]==0) return SG[x]=i;
}
int main()
{
while(scanf("%d", &k) && k)
{
for(int i=1; i<=k; i++)
scanf("%d", &s[i]);
sort(s+1, s+1+k);
memset(SG, -1, sizeof(SG));
scanf("%d",&m);
while(m--)
{
scanf("%d", &l);
int tmp, ans=0;
for(int i=1;i<=l; i++)
{
scanf("%d", &tmp);
ans^=sg(tmp);
}
if(ans==0) printf("L");
else printf("W");
}
printf("\n");
}
return 0;
}
原文地址:https://www.cnblogs.com/alking1001/p/11704461.html
- Golang Stub初体验
- 厚土Go学习笔记 | 20. slice 继续
- 数据挖掘算法之深入朴素贝叶斯分类
- 歪?我想要一个XXE。
- 厚土Go学习笔记 | 19. slice和数组很像,但是slice可以添加元素
- 工具| 手把手教你制作信息收集器之网站备案号
- 厚土Go学习笔记 | 18. 数组
- 厚土Go学习笔记 | 17. 结构体及用指针访问结构体
- Java枚举类型的原理
- 厚土Go学习笔记 | 27. 斐波纳契闭包
- 代码审计| APPCMS SQL-XSS-CSRF-SHELL
- 厚土Go学习笔记 | 33. 利用数据流实现密码代换功能
- 厚土Go学习笔记 | 32. Readers读取数据流
- GoStub框架二次开发实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- keras实现theano和tensorflow训练的模型相互转换
- python中round函数如何使用
- PHP array_reduce()函数的应用解析
- php微信公众号开发之简答题
- php5.x禁用eval的操作方法
- php微信公众号开发之图片回复
- php微信公众号开发之答题连闯三关
- swoole_process实现进程池的方法示例
- golang实现php里的serialize()和unserialize()序列和反序列方法详解
- keras 实现轻量级网络ShuffleNet教程
- Python应用实现处理excel数据过程解析
- Python实现爬取并分析电商评论
- python中怎么表示空值
- Keras自动下载的数据集/模型存放位置介绍
- Keras 切换后端方式(Theano和TensorFlow)