首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-04-09 
全国软件设计大赛题,求解释!某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败

全国软件设计大赛题,求解释!
某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的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;} 

热点排行