| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
请牛人指错(附思路和各子函数功能)思路:
枚举任意一个上顶点和一个下顶点,求其合法性,即此线段形成的直线能从光源发出,再对此线段右边顶点的右边管道进行枚举,若有交点,则求出交点。
#include <stdio.h>
#include <math.h>
typedef struct
{
double x,y;
}Node;
Node array[30];
int num;
double max,min;
void initial();
int law(int i,int j);
void deal();
double cal(int i,int j,int m);
void initial()
{
int i;
max=-10000;
for(i=0;i<num;i++)
{
scanf("%lf%lf",&array[i].x,&array[i].y);
}
}
int law(int i,int j)
{
int k,m,judge=1;
double temp,x0,x1,y0,y1;
x0=array[i].x;
y0=array[i].y-1;
x1=array[j].x;
y1=array[j].y;
k=(i>=j)?i:j;
for(m=0;m<k;m++)
{
if(m!=j&&m!=i)
{
temp=(y1-y0)*(array[m].x-x0)/(x1-x0)+y0;
if(temp>array[m].y||temp<(array[m].y-1))
{
judge=0;
break;
}
}
}
return judge;
}//判断由经过第i个下顶点和第j个上顶点的直线的合法性,若合法则返1。
void deal()
{
int i,j,k,m,n;
double temp,x0,x1,y0,y1,result;
for(i=0;i<num;i++)
for(j=0;j<num;j++)
{
min=-10000;
if(i!=j&&law(i,j))
{
k=(i>j)?i:j;
x0=array[i].x;
y0=array[i].y-1;
x1=array[j].x;
y1=array[j].y;
for(m=k+1;m<num;m++)
if(fabs(x1-x0)>1e-6)
{
temp=y0+(y1-y0)*(array[m].x-x0)/(x1-x0);
if(temp>array[m].y||temp<array[m].y-1)
{
result=cal(i,j,m);
if(result>min)
min=result;
break;
}
}
if(min>max) max=min;
}
}
if(fabs(x1-x0)>1e-10)
temp=y0+(y1-y0)*(array[num-1].x-x0)/(x1-x0);
if(!(temp<array[num-1].y-1||temp>array[num-1].y))
max=10000;
if(fabs(max-10000)<1e-13) printf("Through all the pipe.\n");
else
printf("%.2f\n",max);
}//对经过第i个下顶点和第j个上顶点的合法直线,若其与线段右边的管道有交点,则求出,否则输出Through all the pipe.(这段话是后来加上的)
double cal(int i,int j,int m)
{
double result,temp,x0,x1,y0,y1,x2,y2,x3,y3;
x0=array[i].x;
y0=array[i].y-1;
x1=array[j].x;
y1=array[j].y;
if(fabs(x1-x0)>1e-10)
temp=(y1-y0)*(array[m].x-x0)/(x1-x0)+y0;
if(temp>array[m].y)
{
x2=array[m-1].x;
y2=array[m-1].y;
x3=array[m].x;
y3=array[m].y;
}
else
if(temp<array[m].y-1)
{
x2=array[m-1].x;
y2=array[m-1].y-1;
x3=array[m].x;
y3=array[m].y-1;
}
if(fabs(x3-x2)>1e-13&&fabs(x1-x0)>1e-13&&fabs((y3-y2)/(x3-x2)-(y1-y0)/(x1-x0))>1e-13)
result=((y3-y2)*x2/(x3-x2)+y0-y2-(y1-y0)*x0/(x1-x0))/((y3-y2)/(x3-x2)-(y1-y0)/(x1-x0));
return result;
}//若直线有交点,则求出此交点
int main()
{
scanf("%d",&num);
while(num)
{
initial();
deal();
scanf("%d",&num);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator