全国软件设计大赛题,求解释!该怎么处理

全国软件设计大赛题,求解释!
某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。



答案为:
#include<stdio.h>
#include<math.h>
void f(double a,double b,int* m,int* n,int k)
{
  if(k==0)
  {
  (*n)++;
  if(fabs(a-b)<1000)
  (*m)++;
return;  
  }  
  double ta=a,tb=b;
  ta*=3.0/4.0;  
  tb+=ta*1.0/4.0;  
  f(ta,tb,m,n,k-1);  
  b*=3.0/4.0;  
  a+=b*3.0/4.0;  
  f(a,b,m,n,k-1);
}
void main()
{
double a=1000,b=2000;
int m=0,n=0;
f(a,b,&m,&n,4);
printf("m=%d n=%d\n",m,n);
printf("%f\n",(float)m/(float)n);
}
1,假设战斗中,甲乙获胜的概率都是50%,代码是如何满足这一点的?
2,失败的一方要把自己的体力值的1/4加给胜利的一方。代码中是怎样体现的?
3,如果不用递归该怎样做?求思路?

------解决方案--------------------
1、下面的代码分别代表甲胜和乙胜的两种状态,每一轮递归里都分别考虑两种状况。
2、同样注释在下面:
C/C++ code

 ta*=3.0/4.0;            //  甲减1/4
  tb+=ta*1.0/4.0;    //  乙加1/4
  f(ta,tb,m,n,k-1);    //  乙胜了,递归看下面的情况   
  b*=3.0/4.0;       //  乙减1/4
  a+=b*3.0/4.0;       //  甲加1/4
  f(a,b,m,n,k-1);  //  甲胜了,递归看下面的情况

------解决方案--------------------
#include<stdio.h>
#include<math.h>

double dfs(int n,double A ,double B) //递归形式的写法
{
if(n==0)
{
if(fabs(A-B)>1000)
return 0.0625;
return 0;
}
return dfs(n-1,A+B*0.25,B*0.75)+dfs(n-1,A*0.75,B+A*0.25);
}

int main(void)
{
printf("%lf\n",dfs(4,1000,2000));
return 0;


这段代码更神奇...

------解决方案--------------------
// 递归搜一下..
C/C++ code
#include<stdio.h>
#include<math.h>
struct point{
    int a,b;
}p[30];
int n;
void DFS(double a,double b,int count)
{
    if(count == 4)
    {
        p[n].a = a;
        p[n++].b = b;
        return ;    
    }
    // a win 
        DFS(a+b/4.0,b-b/4.0,count+1);
    //b win
        DFS(a-b/4.0+a/4.0,b+b/4.0+a/4.0,count+1);
}
int main()
{
    int a=1000,b=2000,mac=0;
    n=0;
    DFS(a,b,1);
    for(int i=0;i<n;i++)
        if(fabs(p[i].a-p[i].b)>1000)
                mac++;
        printf("%lf\n",1.0*mac/n);
    return 0;    
}

------解决方案--------------------
C/C++ code
#include <iostream>
#include <cmath>
using namespace std;

bool func(float number1,float number2,int state)
{
    int i=3;
    float temp;
    while (i>=0)
    {
        if (state&(1<<i))
        {
            temp=number2/4;
            number1+=temp;
            number2-=temp;
        } 
        else
        {
            temp=number1/4;
            number1-=temp;
            number2+=temp;
        }
        i--;
    }

    if (fabs(number1-number2)<1000)
    {
        return true;
    }
    else
    {
        return false;
    }
}


int main()
{
    int count=0;
    int state;
    float number1=1000,number2=2000;
    state=0;
    while (state<=15)
    {
        if (func(number1,number2,state))
        {
            count++;
        }
        state++;
    }

    printf("%.2f",count/(float)16);//count 最后是10

    return 0;
}