题意:点球大战~~~
题意:两队点球,分为a队跟b队,a队踢一次b队踢一次,两个队伍加起来一个踢十次,假如可以使比赛先结束,就是胜负已经确定了就没必要继续下面的踢球了。例如 当每个队伍踢球三次 比分是0-3,这时候就没必要继续踢下去了,因为还能踢两次球,a队伍已经不可能赢了。所以比分直接是0-3结束了这场比赛。
思路:dfs搜索枚举各种进球与不进球的状态 加上一个剪枝条件 当枚举的比分a大于或者b大于了输入统计那个比分那么这种状态直接不要
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
double a[10],b[10];
double ans;
int zx,zy;
void dfs(int x,int y,double ga,double gb,int nx,int ny)
{
if(x>zx||y>zy) return ;
if(nx==5&&ny==5)
{
if(x==zx&&y==zy)
{
ans+=ga*gb;
}
return ;
}
if(x<y)
{
if(y-x>5-nx)//当相差的比分大于剩下可踢球的次数,则不需要比了直接统计
{
if(x==zx&&y==zy)
{
ans+=ga*gb;
}
return ;
}
}
if(x>y)
{
if(x-y>5-ny)
{
if(x==zx&&y==zy)
{
ans+=ga*gb;
}
return ;
}
}
if(x+1>y)
{
if(x+1-y<=5-ny)
dfs(x+1,y+1,ga*a[nx+1],gb*b[ny+1],nx+1,ny+1);
else//x踢一次进了大于b队剩下的踢球次数
{
if(x+1==zx&&y==zy)
{
ans+=ga*a[nx+1]*gb;
}
}
}
else
{
dfs(x+1,y+1,ga*a[nx+1],gb*b[ny+1],nx+1,ny+1);
}
if(x+1>y)
{
if(x+1-y<=5-ny)
dfs(x+1,y,ga*a[nx+1],gb*(1-b[ny+1]),nx+1,ny+1);
}
else
{
dfs(x+1,y,ga*a[nx+1],gb*(1-b[ny+1]),nx+1,ny+1);
}
if(x<y)
{
if(y-x<=5-nx-1)
dfs(x,y+1,ga*(1-a[nx+1]),gb*b[ny+1],nx+1,ny+1);
else
{
if(x==zx&&y==zy)
{
ans+=ga*(1-a[nx+1])*gb;
}
}
}
else
{
dfs(x,y+1,ga*(1-a[nx+1]),gb*b[ny+1],nx+1,ny+1);
}
if(x<y)
{ if(y-x<=5-nx-1)
dfs(x,y,ga*(1-a[nx+1]),gb*(1-b[ny+1]),nx+1,ny+1);
}
else
{
dfs(x,y,ga*(1-a[nx+1]),gb*(1-b[ny+1]),nx+1,ny+1);
}
}
int main()
{ int xxx=1;
while(scanf("%lf",&a[1])!=EOF)
{ for(int i=2;i<=5;i++)
{
scanf("%lf ",&a[i]);
}
for(int i=1;i<=5;i++)
{
scanf("%lf ",&b[i]);
}
scanf("%d-%d",&zx,&zy);
ans=0;
dfs(0,0,1,1,0,0);//表示a队得分b队得分a队概率b队概率,a队踢球的次数,b队踢球的次数。
printf("Case %d: %.2lf%%\n",xxx++,ans*100);
}
}