Game of Cards Gym - 102822G

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Game of Cards Gym - 102822G相关的知识,希望对你有一定的参考价值。

Game of Cards Gym - 102822G

题意:

小兔子和小马喜欢玩奇怪的纸牌游戏。现在,他们正在玩一种叫做0123游戏的纸牌游戏。桌子上有几张牌。其中c0标记为0,c1标记为1,c2标记为2,c3标记为3。小兔子和小马轮流玩游戏,小兔子先走。在每一回合中,玩家应选择两张牌,条件是两张牌上的数字之和不超过3,然后将这两张牌换成标有其和的牌。不能移动的玩家将输掉比赛。小兔子和小马在想谁会赢这场比赛
c0, c1, c2, c3 (0 <= c0, c1, c2, c3 <= 1e9)

题解:

题目的数据范围就说明了这个题用记忆化搜索+sg函数无法做出,这么大的范围说明是个找规律题
这种题貌似只能枚举出所有的情况:
参考题解
这篇文章分析讲解的非常到位,这种题我还是没有经验
我感觉关键地方在于两个1可以得到一个2,2又可以和一个1合成3,相当于这一趟1牌少了3个,但是对方度过一轮,所以要考虑c1%3的情况(c1为1牌的数量)
在这里插入图片描述

代码:

我一开始写的打表sg()代码

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\\n",a,b);
typedef long long ll;
using namespace std;

inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
   return s*w;
}

int sg[22][22][22][22];
int check(int a,int b,int c,int d){
	if(sg[a][b][c][d]!=-1)return sg[a][b][c][d];
	if(a==0&&b==0)return sg[a][b][c][d]=0;
	int vis[10300];
	memset(vis,0,sizeof(vis));
	if(a>=2)
		vis[check(a-1,b,c,d)]=1;
	if(b>=2)
		vis[check(a,b-2,c+1,d)]=1;
	if(a>=1&&c>=1)
		vis[check(a-1,b,c,d)]=1;
	if(a>=1&&d>=1)
		vis[check(a-1,b,c,d)]=1;
	if(b>=1&&c>=1)
		vis[check(a,b-1,c-1,d+1)]=1;
	for(int i=0;i<10300;i++){
		if(!vis[i])return sg[a][b][c][d]=i;
	}
}

int main()
{
	int t;
	int cas=0;
	memset(sg,-1,sizeof(sg));
	for(int a=0;a<=10;a++)
	for(int b=0;b<=10;b++)
	for(int c=0;c<=10;c++)
	for(int d=0;d<=12;d++)
	{
		printf("Case #%d: a=%d,b=%d,c=%d,d=%d ",++cas,a,b,c,d);
		if(check(a,b,c,d))puts("Rabbit");
		else puts("Horse");
	}
}

根据规律得到的正解

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5;
#define ll long long
int check(int a[5])
{
    if (a[1]==0 && a[2]==0)//只有0和3
    {
        if (a[3]==0)
        {
            if (a[0]%2==1 || a[0]==0)
                return -1;
        }
        else if (a[0]%2==0)
        {
            return -1;
        }
        return 1;
    }
    if (a[0]%2==0)
    {
        if (a[1]%3==0)
        {
            return -1;
        }
        if (a[1]%3==1 && a[2]==0)
        {
            return -1;
        }
    }
    else
    {
        if (a[1]%3==1 && a[2]>0)
        {
            return -1;
        }
        if (a[1]%3==2 && a[2]<=1)
        {
            return -1;
        }
    }
    return 1;
}
int main()
{
    int t, tot=0;
    scanf("%d", &t);
    while(t--)
    {
        int a[5];
        scanf("%d%d%d%d", &a[0], &a[1], &a[2], &a[3]);
        if (check(a)==1)
        {
            printf("Case #%d: Rabbit\\n", ++tot);
        }
        else
        {
            printf("Case #%d: Horse\\n", ++tot);
        }
    }
}


以上是关于Game of Cards Gym - 102822G的主要内容,如果未能解决你的问题,请参考以下文章

CF777B Game of Credit Cards

GYM - 101147 A.The game of Osho

Gym - 101438F Tree Game

Gym–101061A Cards(有待更新)

Shuffle Cards ( Gym - 247729C )

Shuffle Cards ( Gym - 247729C )