题解报告:hdu 1848 Fibonacci again and again(尼姆博弈)

Posted 霜雪千年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解报告:hdu 1848 Fibonacci again and again(尼姆博弈)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848

Problem Description
任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:
F(1)=1;
F(2)=2;
F(n)=F(n-1)+F(n-2)(n>=3);
所以,1,2,3,5,8,13……就是菲波那契数列。
在HDOJ上有不少相关的题目,比如1005 Fibonacci again就是曾经的浙江省赛题。
今天,又一个关于Fibonacci的题目出现了,它是一个小游戏,定义如下:
1、  这是一个二人游戏;
2、  一共有3堆石子,数量分别是m, n, p个;
3、  两人轮流走;
4、  每走一步可以选择任意一堆石子,然后取走f个;
5、  f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8…等数量);
6、  最先取光所有石子的人为胜者;
假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢。
Input
输入数据包含多个测试用例,每个测试用例占一行,包含3个整数m,n,p(1<=m,n,p<=1000)。
m=n=p=0则表示输入结束。
Output
如果先手的人能赢,请输出“Fibo”,否则请输出“Nacci”,每个实例的输出占一行。
Sample Input
1 1 1
1 4 1
0 0 0
Sample Output
Fibo
Nacci
解题思路:此题同样用SG值记录P/N状态值。题意:取石子问题,一共有3堆石子,每次只能取斐波那契数个石子,先取完石子者胜利,问先手胜还是后手胜。上一篇已经对求SG值做详细讲解,这里就直接引用结果:1、可选步数为一系列不连续的数,用get_SG(计算);2、将所有SG值异或,结果不是0,则先手必赢,反之后手必赢。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1010;
 4 int m,n,p,f[15],sg[maxn];
 5 bool vis[maxn];
 6 void init(){
 7     f[0]=1;f[1]=2;
 8     for(int i=2;i<15;++i)f[i]=f[i-1]+f[i-2];//f数组长度为15即下标为14,因为fib[15]刚好大于1000
 9 }
10 void get_SG(){
11     memset(sg,0,sizeof(sg));
12     for(int i=1;i<maxn;++i){
13         memset(vis,false,sizeof(vis));
14         for(int j=0;j<15 && f[j]<=i;++j)//j<15要放在判断条件前面,不然会越界出错
15             vis[sg[i-f[j]]]=true;
16         for(int j=0;j<maxn;++j)
17             if(!vis[j]){sg[i]=j;break;}
18     }
19 }
20 int main()
21 {
22     init();
23     get_SG();
24     while(cin>>m>>n>>p && (m+n+p)){
25         if(sg[m]^sg[n]^sg[p])cout<<"Fibo"<<endl;//如果三者异或不为0,则先手必赢
26         else cout<<"Nacci"<<endl;//否则后手必赢
27     }
28     return 0;
29 }

 

以上是关于题解报告:hdu 1848 Fibonacci again and again(尼姆博弈)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1848 Fibonacci again and again

HDU1848 Fibonacci again and again

HDU 1848 Fibonacci again and again

hdu 1848 Fibonacci again and again(SG函数)

HDU1848 Fibonacci again and again(SG函数)

HDU 1848(sg博弈) Fibonacci again and again