这道题是典型的sg函数来解决的博弈问题。
先给出了可以移动石子数量的取值区间就是一个一千以下的斐波那契数列,这个好办,直接一个数组完事。
然后给出三堆石子的数量,m,n,p;
我们的思路就是把1000以下的所有数的sg值都打表出来。
然后再将m n p三个数的sg值异或起来,if(sg[m]^sg[n]^sg[p])成立则先手赢,否则后手赢。
给一个sg函数的简介链接 http://www.cnblogs.com/liyinggang/p/5768711.html
好了看代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[15],SG[1005];
bool S[1005];
void aaaa(){
a[0]=1;
a[1]=2;
for(int i=2;i<15;i++)
a[i]=a[i-1]+a[i-2];
}
void gtSG(){
int i,j;
memset(SG,0,sizeof(SG));
for(i=1;i<1005;i++){
memset(S,0,sizeof(S));
for(j=0;j<15&&a[j]<=i;j++){
S[SG[i-a[j]]]=1;//注意 这个地方,很容易写成:S[i-a[j]]=1;
}
for(int k=0;;k++)if(!S[k]){
SG[i]=k;
break;
}
}
}
int main ()
{
int m,n,p;
aaaa();
gtSG();
while(scanf("%d%d%d",&m,&n,&p)&&(m||n||p)){
if(SG[m]^SG[n]^SG[p])
printf("Fibo\n");
else
printf("Nacci\n");
}
return 0;
}