HDOJ 5724 Chess

又是多校的一道所谓签到题:但是感觉还是有难度的:HDOJ 5724

是一道典型的sg博弈打表的题


sg函数和NIM游戏已经解释得够多的了,现在就只分析这个题目

需要分阶段:一行一个阶段,然后把所有的sg值异或起来


然后呢,需要对每一行进行分析,因为最多20列,所以可以提前打表弄好,也可以用-1作为访问标记,来记忆化搜索

如何得到sg值?就需要对题意分析,如何得到后继状态?


后继:把一个棋子移到右边的空格子,或者是一个棋子,跳过右边相邻的棋子,进入相邻的空格

所以就是检测一个有棋子的格子,和一个没有棋子的格子,然后与原理状态异或,则变成了新状态(也就是后继状态)


见代码:

(打表的写法)

#include<bits/stdc++.h>
using namespace std;

const int maxn=21;
int sg[1<<maxn];

int getsg(int x){
	bool mex[maxn<<1];
	memset(mex,false,sizeof(mex));
	for(int i=20;i>=0;i--){
		if (x&(1<<i))
			for(int j=i-1;j>=0;j--)
				if (!(x&(1<<j))){
					int tmp=x^(1<<i)^(1<<j);
					mex[sg[tmp]]=true;
					break;
				}
	}
	for(int i=0;;i++)
		if (!mex[i]) return i;
}

int main(){
	//freopen("input.txt","r",stdin);
	memset(sg,0,sizeof(sg));
	int maxnum=(1<<20);
	for(int i=0;i<maxnum;i++)
		sg[i]=getsg(i);
	int T,n,m,x,ans,temp;
	scanf("%d",&T);
	while(T--){
		ans=0;
		scanf("%d",&n);
		while(n--){
			scanf("%d",&m);
			temp=0;
			while(m--){
				scanf("%d",&x);
				temp=temp|(1<<(20-x));
			}
			ans^=sg[temp];
		}
		printf("%s\n",ans?"YES":"NO");
	}
	return 0;
}

记忆化搜索的写法:

#include<bits/stdc++.h>
using namespace std;

const int maxn=21;
int sg[1<<maxn];

int getsg(int x){
	if (sg[x]!=-1) return sg[x];
	bool mex[maxn<<1];
	memset(mex,false,sizeof(mex));
	for(int i=20;i>=0;i--){
		if (x&(1<<i))
			for(int j=i-1;j>=0;j--)
				if (!(x&(1<<j))){
					int tmp=x^(1<<i)^(1<<j);
					mex[getsg(tmp)]=true;
					break;
				}
	}
	for(int i=0;;i++)
		if (!mex[i]) return sg[x]=i;
}

int main(){
	//freopen("input.txt","r",stdin);
	memset(sg,-1,sizeof(sg));
	int T,n,m,x,ans,temp;
	scanf("%d",&T);
	while(T--){
		ans=0;
		scanf("%d",&n);
		while(n--){
			scanf("%d",&m);
			temp=0;
			while(m--){
				scanf("%d",&x);
				temp=temp|(1<<(20-x));
			}
			ans^=getsg(temp);
		}
		printf("%s\n",ans?"YES":"NO");
	}
	return 0;
}


全部评论

相关推荐

牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
10-12 19:08
666 C++
花开蝶自来_:技能:听动物叫,让雪豹闭嘴
点赞 评论 收藏
分享
12-01 12:34
已编辑
广东工业大学 Java
如题,fw🐭🐭,加上准备的太晚,大三上已找不到日常实习,导致连锁反应,下学期的暑期实习找不到好的实习,导致秋招找不到中大厂,现在是中小厂Java还有考公的选择,由于有些中小厂工作强度比肩大厂,钱还少,感觉不如考公如果🐮u们是我现在这种情况,会怎么选?
负债的混子:关注你一段时间了,突然发现你头像名字都改了,想必是这段时间压力很大。关于就业还是考公的选择,就像很多牛友说的:不要美化自己没走过的路。你现在想往互联网发展,发现这条路很难走,然后想往考公发展,但是你没走过考公这条路,所以你不知道这条路的压力如何。你今年大三了,还有时间给你做选择,我希望你能够尽快的决定自己的方向,然后一条路走到黑,而不是在这里徘徊,每个人的道路是不一样的,你无法复刻别人的路,你能做的就是尽力的完善自己。 最后,我想说的是,加油,陌生人!
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务