博弈论——斐波那契博弈Fibonacci Game

题目描述
有一堆个数为n(n≥2)的石子,游戏双方轮流取石子,规则如下:
先手不能在第一次把所有的石子取完,至少取1颗;
之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。

结论:
当且仅当石子数为斐波那契数时,先手必败。

代码如下:

#include
using namespace std;
map<int,int>m;
int f[1005];
void solve(){
	f[1]=f[2]=1;
	for(int i=3;i<=1000;++i)f[i]=f[i-1]+f[i-2],m[f[i]]=1;
}
int main(){
	int n;
	solve();
	while(cin>>n){
		if(m[n]==1)cout<<"先手必败"<<endl;
		else cout<<"先手必胜"<<endl;
	}
}

你可能感兴趣的:(算法学习,算法)