HDU1848
HDU1848尼姆博弈-sg(模版)先求出sg值,采用尼姆博弈的思路将sg[n]^sg[m]^sg[p]判断胜败情况。#include<iostream>#include<algorithm>#include<map>#include<set>#include<vector>#include<cstring>#include&
·
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;
}
更多推荐
已为社区贡献21条内容
所有评论(0)