斐波那契博弈

来源:互联网 发布:2017淘宝大学视频教程 编辑:程序博客网 时间:2024/05/16 10:29

斐波那契博弈:

有一堆物品,两人轮流取物品,先手最少取一个,至多无上限,但不能把物品取完,之后每次取的物品数不能超过上一次取的物品数的二倍且至少为一件,取走最后一件物品的人获胜。

结论是:先手胜当且仅当n不是斐波那契数(n为物品总数)

如HDU2516:

#include <iostream>  #include <string.h>  #include <cstdio>  using namespace std;  const int N = 55;    int f[N];   void Init()  {      f[0] = f[1] = 1;      for(int i=2;i<N;i++)          f[i] = f[i-1] + f[i-2];  }    int main()  {      Init();      int n;      while(cin>>n)      {          if(n == 0) break;          bool flag = 0;          for(int i=0;i<N;i++)          {              if(f[i] == n)              {                  flag = 1;                  break;              }          }          if(flag) puts("Second win");          else     puts("First win");      }      return 0;  } 


1 0
原创粉丝点击