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];
int k, m, l;
int sg(int x)
{
if(SG[x]!=-1) return SG[x];//记忆化搜索
bool book[105];
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;
}

S-Nim HDU 1536 博弈 sg函数的更多相关文章

  1. HDU 1536 求解SG函数

    #include<stdio.h> #include<string.h> #include<algorithm> #include<set> using ...

  2. hdu 5795 A Simple Nim 博弈sg函数

    A Simple Nim Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Pro ...

  3. HDU 5795 A Simple Nim 打表求SG函数的规律

    A Simple Nim Problem Description   Two players take turns picking candies from n heaps,the player wh ...

  4. HDU 1536 S-Nim SG博弈

    S-Nim Problem Description   Arthur and his sister Caroll have been playing a game called Nim for som ...

  5. hdu 3032(博弈sg函数)

    题意:与原来基本的尼姆博弈不同的是,可以将一堆石子分成两堆石子也算一步操作,其它的都是一样的. 分析:由于石子的堆数和每一堆石子的数量都很大,所以肯定不能用搜索去求sg函数,现在我们只能通过找规律的办 ...

  6. HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)

    Fibonacci again and again Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  7. 尼姆博弈+SG函数

    博弈这个东西真的很费脑诶.. 尼姆博奕(Nim Game):游戏者轮流从一堆棋子(或者任何道具)中取走一个或者多个,最后不能再取的就是输家.当指定相应数量时,一堆这样的棋子称作一个尼姆堆 当n堆棋子的 ...

  8. HDU-4678 Mine 博弈SG函数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4678 题意就不说了,太长了... 这个应该算简单博弈吧.先求联通分量,把空白区域边上的数字个数全部求出 ...

  9. (转)博弈 SG函数

    此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------- ...

随机推荐

  1. Spring Boot Starters 究竟是怎么回事

    Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...

  2. 【NOIP2017提高组模拟12.10】幻魔皇

    题目 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白色节 ...

  3. c# 谷歌动态口令对接

    https://www.cnblogs.com/easyauthor/p/11054869.html Google 身份验证器与两步验证功能配合,可在您登录 Google 帐户时为您平添一重安全保障. ...

  4. Golang入门及开发环境配置

    Go语言诞生背景 计算机硬件更新频繁,主流编程语言无法发挥多核多CPU的性能 软件系统复杂度不断变高,缺乏简洁高效的编程语言 C/C++运行速度快,但编译速度慢 Go语言特点 静态类型开发语言 静态: ...

  5. ClustrixDB安装配置

    前提条件 在安装ClustrixDB之前,需要: ClustrixDB安装程序和许可证密钥. 运行CentOS或RHEL 7.4的服务器(本地或云中). 具有root或sudo特权来安装Clustri ...

  6. js 数组 splice 函数 多线程

    <script type="text/javascript"> var arr = new Array(6) arr[0] = "00" arr[1 ...

  7. golang rabbitmq实践 (二 实现简单的消息收发)

    1:驱动 本来打算自己写一个驱动的,后来发现github上面已经有了,那我就直接拿现成的了, 驱动采用 github.com/streadway/amqp ,直接import就可以啦! 2:excha ...

  8. Android图片缩放 指定尺寸

    //使用Bitmap加Matrix来缩放     public static Drawable resizeImage(Bitmap bitmap, int w, int h)     {       ...

  9. Luogu P5469 [NOI2019]机器人 (DP、多项式)

    不用FFT的多项式(大雾) 题目链接: https://www.luogu.org/problemnew/show/P5469 (这题在洛谷都成绿题了海星) 题解: 首先我们考虑,一个序列位置最右边的 ...

  10. Oracle数据库表空间查看和更改

    set linesize 200  --设置输出一行字符个数为200 1.查看表空间名称和大小(单位MB) SELECT t.tablespace_name, round(SUM(bytes / (1 ...