【回溯法】竞赛游戏

题目描述

某游戏规则中,甲乙双方战斗,每一回合总能分出胜负,游戏规定:
1.失败的一方要将自己体力值的1/4加给胜利的一方。
2.游戏开始时,甲的体力值是1000,乙的体力值是2000。
3.每一回合,甲乙胜利的概率均为50%。
求解4个回合后,双方体力值之差小于1000的概率。

分析

每一回合结束,要么甲赢,要么乙赢。n个回合,那么有2^n种结果,采用回溯法从解空间中,中找出abs(a-b)<1000的结果即可。

代码

#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
int i=1,count=0;
float m=1000,a=1000,n=1000,b=1000;
void backdate(int n);
int sum;
int main()
{
	scanf("%d",&sum);
	backdate(1);
	printf("%d",count);
	return 0;
}
void backdate(int i)
{
	float tmp;
	int j;
	if(i>sum)
	{
		if(abs(a-b)<1000)
			count++;
		return ;
	}
	m=a,n=b;		
	a+=b/4;
	b-=b/4;
	backdate(i+1);
	a=m,b=n;
	b+=a/4;
	a-=a/4;
	backdate(i+1);	
	return;
}

posted @ 2016-08-02 14:11  zkang  阅读(292)  评论(0编辑  收藏  举报