首页 > 其他分享 >取石子游戏与SG函数

取石子游戏与SG函数

时间:2023-05-31 19:04:55浏览次数:47  
标签:const 游戏 int 石子 vis include SG


题目:http://acm.hdu.edu.cn/showproblem.php?pid=1848


题意:有3堆石子,石子数量分别为a,b,c,有两个玩家,每次只能从任意一堆中取f个,这里的f只能为fibnacci数,问是先手胜

还是先手败.


分析:由于石子的数量都在1000以内,那么我们可以先预处理出1000以内的SG函数值,然后对于3堆石子,我们进行异或,如果为

0说明先手必败,否则必胜,当然求SG函数的值用深搜就行了.



#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N = 1005;
const int M = 25;

int fib[25];
int SG[N];

int mex(int x)
{
    bool vis[M];
    memset(vis,0,sizeof(vis));
    for(int i=0;i<M;i++)
    {
        int t = x - fib[i];
        if(t < 0) break;
        if(SG[t] == -1)
            SG[t] = mex(t);
        vis[SG[t]] = 1;
    }
    for(int i=0;;i++)
    if(!vis[i]) return i;
}

void Init()
{
    fib[0] = 1;
    fib[1] = 2;
    for(int i=2;i<M;i++)
        fib[i] = fib[i-1] + fib[i-2];
    memset(SG,-1,sizeof(SG));
    for(int i=0;i<N;i++)
        SG[i] = mex(i);
}

int main()
{
    Init();
    int a,b,c;
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        if(a == 0 && b == 0 && c == 0) break;
        int ans = 0;
        ans ^= SG[a];
        ans ^= SG[b];
        ans ^= SG[c];
        if(ans) puts("Fibo");
        else    puts("Nacci");
    }
    return 0;
}




题目:http://acm.hdu.edu.cn/showproblem.php?pid=1536


分析:本题基本上跟上体一样,只是把3堆改为x堆,把取fibnacci数列颗石子改为取指定输入的石子个数.那么做法实际上一

样,我们对输入的序列进行排序,然后求出它们的SG函数的值,然后直接用即可.



#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>

using namespace std;
const int N = 10005;
const int M = 105;

int a[M];
int SG[N];
int n;

int mex(int x)
{
    bool vis[M];
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++)
    {
        int t = x - a[i];
        if(t < 0) break;
        if(SG[t] == -1)
            SG[t] = mex(t);
        vis[SG[t]] = 1;
    }
    for(int i=0;;i++)
    if(!vis[i]) return i;
}

int main()
{
    while(~scanf("%d",&n))
    {
        if(n == 0) break;
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        memset(SG,-1,sizeof(SG));
        for(int i=0;i<N;i++)
            SG[i] = mex(i);
        int m;
        scanf("%d",&m);
        while(m--)
        {
            int ans = 0;
            int len,t;
            scanf("%d",&len);
            for(int i=0;i<len;i++)
            {
                scanf("%d",&t);
                ans ^= SG[t];
            }
            if(ans) printf("W");
            else    printf("L");
        }
        puts("");
    }
    return 0;
}





标签:const,游戏,int,石子,vis,include,SG
From: https://blog.51cto.com/u_16146153/6388986

相关文章

  • HDU1524(博弈--有向无环图SG函数)
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1524题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步,如果到某一步玩家不能移动时,那么这个人就输.分析:本题是最典型的有向无环图的博弈,利用dfs把所有顶点的SG值......
  • POJ2886线段树 Joseph游戏(单点更新)
    题目:WhoGetstheMostCandies? 题意:1.n个人进行Joseph游戏,游戏共p轮(p为思路:用相对坐标来处理,例如这一轮出局的是p,下一个要+m,则p出局时p+1就变成了p(因为是相对坐标),则下一个人应该是p+m-1,再注意循环和m的正负的处理,不要忘了取模。2.求解原始序号时维护一棵线段树,类似上一题插队......
  • 贪吃蛇游戏代码
    #include<stdio.h>#include<conio.h>#include<stdlib.h>#include<time.h>constintmaxn=100;constintn=20;structnode{ intx,y;};intmap[maxn][maxn];//0表示空格,1表示蛇身,2表示食物,3表示撞死的位置,4表示蛇头.nodefood;nodesquence[m......
  • 石子合并(GarsiaWachs算法)
    对于石子合并问题,有一个最好的算法,那就是GarsiaWachs算法。时间复杂度为O(n^2)。它的步骤如下:设序列是stone[],从左往右,找一个满足stone[k-1]<= stone[k+1]的k,找到后合并stone[k]和stone[k-1],再从当前位置开始向左找最大的j,使其满足stone[j]> stone[k]+stone[k-1],插到j的后面就......
  • win11鼠标能动但是无法点击怎么办 win11鼠标能动但是无法点击解决方案(WSG实测可以)
    win11用户在使用电脑的时候遇到了鼠标能动但是无法点击的情况,像这种情况要怎么办呢?你先按住ctrl+alt+delete这组快捷键,然后打开任务管理器,接着选择运行新任务,输入explorer.exe,之后系统就会自动刷新桌面缓存,这个时候应该问题就解决了。如果不行的话,应该是鼠标驱动出问题了,建议大家......
  • [TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程、问题解析、常见参数
    做什么法如扫描仪是一个三维的激光扫描仪,可以通过特定的作业模式将空间以三维激光点云的形式保存下来,并且通过特定的算法得出一些想要的具体参数。这个SDK探幽日志主要是对目前SDK开发中遇到的一些问题做个记录,以及对未来开发的一些指导,只是在业余时间简单写写,之后还会深入探索......
  • 1万多关数独逻辑游戏ACCESS\EXCEL数据库
    数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。每一关存储了81个数字,按顺序填入九宫格,数字0表示待填项,如下图所做示......
  • docker evel=error msg="error reading the kernel parameter net.ipv4.vs.expire_nod
    我使用的是dockerswarm-#报错evel=errormsg="errorreadingthekernelparameternet.ipv4.vs.expire_nodest_conn"error="open/proc/sys/net/ipv4/vs/expire_nodest_conn:nosuchfileordirectory"-#查看是否开启ip_vslsmod|grepip_vs==============......
  • Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付|附代码
    全文链接:http://tecdat.cn/?p=26184最近我们被客户要求撰写关于信贷风控模型的研究报告,包括一些图形和统计输出。在此数据集中,我们必须预测信贷的违约支付,并找出哪些变量是违约支付的最强预测因子?以及不同人口统计学变量的类别,拖欠还款的概率如何变化?有25个变量:ID: 每个客户......
  • 莉莉丝游戏与火山引擎 ByteHouse 达成合作,为实时数仓建设提速
    中国头部游戏公司莉莉丝游戏(Lilith)和火山引擎ByteHouse达成合作,共同致力于加速莉莉丝游戏的实时数仓建设。此次合作将利用ByteHouse的创新技术和功能,为广告运营分析业务提效提供全面支持和帮助。莉莉丝游戏是中国中生代游戏公司代表,在中国游戏市场保持领先地位。为了支持其日......