HDU1848
尼姆博弈-sg(模版) 
先求出sg值,采用尼姆博弈的思路将sg[n]^sg[m]^sg[p]判断胜败情况。 
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<cstring>
#include<cmath>
#include<iomanip>
using namespace std;
const int maxx=1015;
int f[50];
int sg[maxx];
int mex[maxx];
int n,m,p;
void SG(int n){
	memset(sg,0,sizeof(sg));
	for(int i=1;i<maxx;i++){
		memset(mex,0,sizeof(mex));
		for(int j=0;j<n&&i>=f[j];j++){
			mex[sg[i-f[j]]]=1;
		}
		for(int j=0;j<maxx;j++){
			if(mex[j]==0){
				sg[i]=j;
				break;
			}
		} 
	}
}
int main(){
	f[0]=1;f[1]=2;
	for(int i=2;i<maxx;i++){
		f[i]=f[i-1]+f[i-2];
	}
	SG(maxx);
	while(cin>>m>>n>>p){
		if(n==0&&m==0&&p==0)break;
		if(sg[n]^sg[m]^sg[p]){
			cout<<"Fibo"<<endl;
		}else{
			cout<<"Nacci"<<endl;
		}
	}
	return 0;
}

方法二-此段代码有一点问题 
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
using namespace std;
const int maxx=1155;
int f[maxx+5];
int sg[maxx+5];
int n,m,p;
void init(){
	f[0]=1;f[1]=2;
	for(int i=2;i<maxx;i++){
		f[i]=f[i-1]+f[i-2];
	} 
}
int SG(int x){
	if(sg[x]!=0){
		return sg[x];
	} 
	int mex[maxx];
	memset(mex,0,sizeof(mex));
	for(int i=0;i<n;i++){
		if(x>=f[i]){
			SG(x-f[i]);
			mex[sg[x-f[i]]]=1;
		} 
	}
	for(int i=0;i<maxx;i++){
		if(mex[i]==0){
			sg[x]=i;
			break;
		}
	}
	return sg[x];
}
int main(){
	init();
	while(cin>>n>>m>>p){
		if(n==0&&m==0&&p==0)break;
		memset(sg,0,sizeof(sg));
		if(SG(n)^SG(m)^SG(p)!=0){
			cout<<"Fibo"<<endl;
		}else{
			cout<<"Nacci"<<endl;
		}
	}
	return 0;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐