题意:有一堆数量为n的石子, 第一个人可以取任意多的石子x(但是不能取完),第二个人取的数量是1-2*x;谁先取完谁赢
思路:斐波那契博弈, 套路是:
1.第一个人不能取完
2.第二个人取上一个人的1~2*x 的范围。
n=2时,B必胜
n=3时,B必胜
n=4,A取1个,那么必赢
n=5,A取234必输,取1,相对B来说是n=4的情况,B必胜,A必输
n=6,A取2345必输,取1,相对B来说是情况为5,那么B必输,A必胜
n=7,A取3456必输,取1,对B来说是n=6的情况,B必胜,A必输。取2,对于B来说是n=5的情况,B必输,A必胜,那么A会选先抽2个石子
n=8,A取34567必输,A取1,对于B当前来说是n=7的情况,B必胜,A必输。A取2,对于B来说是n=6的情况,B必胜,A必败。
……
找规律:2358 B胜,如果石子数量是斐波那契数列里的某一个数,B必胜,A必败;否则B必败,A必胜。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[500];
const int maxn=INT_MAX;
void init()
{
f[1]=f[2]=1;
for(int i=3;i<=50;i++)
f[i]=f[i-1]+f[i-2];
/*for(int i=1;i<=50;i++) printf("%d %I64d\n",i,f[i]-maxn);*/
return ;
}
int main(void)
{
init();
int n;
while(cin >> n && n)
{
int flag=0;
for(int i=3;i<=50;i++)
{
if(n==f[i])
{
flag=1;
break;
}
}
if(!flag) printf("First win\n");
else printf("Second win\n");
}
}
其他类型博弈:https://wenku.baidu.com/view/249434d284254b35eefd3498.html