博弈论题目集 (持续更新)

巴什博弈  HDU 1846

1、  本游戏是一个二人游戏;
2、  有一堆石子一共有n个;
3、  两人轮流进行;
4、  每走一步可以取走1…m个石子;
5、  最先取光石子的一方为胜;

这个应该比较好推:

如果 n % (m+1)==0 后手胜利 否则 先手胜利

#include
#include
#include
using namespace std;
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,m;
		scanf("%d%d",&n,&m);
		if(n%(m+1)==0) printf("second\n");
		else printf("first\n");
	}
	return 0;
}

斐波拉契博弈 HDU 2516

有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:

1、先手不能在第一次把所有的石子取完,至少取1颗;

2、之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍;

3、约定取走最后一个石子的人为赢家;

f[1]=1,f[2]=2的斐波那契数列

如果n为斐波拉契数列的一项,那么先手必败,否则先手必胜。

有篇解释的很清楚的博客:https://blog.csdn.net/dgq8211/article/details/7602807###

#include
#include
#include
using namespace std;
typedef long long ll;
ll f[50];
int main(){
	f[1]=1,f[2]=2;
	for(int i = 3; i <= 48; i++) f[i]=f[i-1]+f[i-2];
	//printf("%lld\n",f[48]);
	ll n;
	while(scanf("%lld",&n)&&n){
		int flag = 0;
		for(int i = 2; i <= 48; i++){
			if(n==f[i]){
				flag=1;
				break;
			}
		}
		if(flag) puts("Second win");
		else puts("First win");
	}
	return 0;
}

 

你可能感兴趣的:(博弈论)