几何题
#include<math.h>
#include<string.h>
#include <stdio.h>
struct Point
{
double x,y;
};
struct Line
{
double x1, y1;
double x2, y2;
};
int n;
double x[20],y[20];
Line line;
int result;
double dis;
Point cut(Line l)
{
double a1, b1, a2, b2;
a1=(line.y2-line.y1)/(line.x2-line.x1);
b1=line.y1-a1*line.x1;
a2=(l.y2-l.y1)/(l.x2-l.x1);
b2=l.y1-a1*l.x1;
Point p;
p.x=(b2-b1)/(a1-a2);
p.y=a1*p.x+b1;
return p;
}
double ppdis(Point p1, Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double distance()
{
double dis1, dis2;
Point p1,p2,p3;
p1.x=0, p1.y=(line.y2-line.y1)/(line.x2-line.x1)*(0-line.x1)+line.y1;
Line line1, line2;
line1.x1=x[result-1];
line1.y1=y[result-1];
line1.x2=x[result];
line1.y2=y[result];
p2=cut(line1);
line2.x1=x[result-1];
line2.y1=y[result-1]-1;
line2.x2=x[result];
line2.y2=y[result]-1;
p3=cut(line2);
dis1=ppdis(p1,p2);
dis2=ppdis(p1,p3);
// printf("%d %lf %lf\n",result, p2.x,p2.y);
if(dis1 < dis2)
return dis2;
else
return dis1;
}
bool thro(int i)
{
double holdy=(line.y2-line.y1)/(line.x2-line.x1)*(x[i]-line.x1)+line.y1;
if(holdy >= y[i] - 1 && holdy <= y[i])
return 1;
else
return 0;
}
int cnt()
{
int i;
for(i = 0; i < n; i++)
{
if(!thro(i))
break;
}
return i;
}
void func()
{
int i, j;
int res;
for(i = 0; i < n; i++)
{
for(j = i+1; j < n; j++)
{
line.x1=x[i];
line.y1=y[i];
line.x2=x[j];
line.y2=y[j];
res=cnt();
if(result<res)
{
result=res;
dis=distance();
}
line.x1=x[i];
line.y1=y[i];
line.x2=x[j];
line.y2=y[j]-1;
res=cnt();
if(result<res)
{
result=res;
dis=distance();
}
line.x1=x[i];
line.y1=y[i]-1;
line.x2=x[j];
line.y2=y[j];
res=cnt();
if(result<res)
{
result=res;
dis=distance();
}
line.x1=x[i];
line.y1=y[i]-1;
line.x2=x[j];
line.y2=y[j]-1;
res=cnt();
if(result<res)
{
result=res;
dis=distance();
}
}
}
}
int main()
{
while(scanf("%d", &n)!=EOF)
{
if(n == 0)
break;
result=0;
dis=0;
int i;
for(i = 0; i < n; i++)
{
scanf("%lf%lf", &x[i], &y[i]);
}
func();
/* line.x1=0,line.y1=1,line.x2=4,line.y2=1;
int xx=thro(3);
printf("%d\n",xx);*/
if(result < n)
printf("%.2f\n",dis);
else
printf("Through all the pipe.\n");
}
return 0;
}
#include<string.h>
#include <stdio.h>
struct Point
{
double x,y;
};
struct Line
{
double x1, y1;
double x2, y2;
};
int n;
double x[20],y[20];
Line line;
int result;
double dis;
Point cut(Line l)
{
double a1, b1, a2, b2;
a1=(line.y2-line.y1)/(line.x2-line.x1);
b1=line.y1-a1*line.x1;
a2=(l.y2-l.y1)/(l.x2-l.x1);
b2=l.y1-a1*l.x1;
Point p;
p.x=(b2-b1)/(a1-a2);
p.y=a1*p.x+b1;
return p;
}
double ppdis(Point p1, Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double distance()
{
double dis1, dis2;
Point p1,p2,p3;
p1.x=0, p1.y=(line.y2-line.y1)/(line.x2-line.x1)*(0-line.x1)+line.y1;
Line line1, line2;
line1.x1=x[result-1];
line1.y1=y[result-1];
line1.x2=x[result];
line1.y2=y[result];
p2=cut(line1);
line2.x1=x[result-1];
line2.y1=y[result-1]-1;
line2.x2=x[result];
line2.y2=y[result]-1;
p3=cut(line2);
dis1=ppdis(p1,p2);
dis2=ppdis(p1,p3);
// printf("%d %lf %lf\n",result, p2.x,p2.y);
if(dis1 < dis2)
return dis2;
else
return dis1;
}
bool thro(int i)
{
double holdy=(line.y2-line.y1)/(line.x2-line.x1)*(x[i]-line.x1)+line.y1;
if(holdy >= y[i] - 1 && holdy <= y[i])
return 1;
else
return 0;
}
int cnt()
{
int i;
for(i = 0; i < n; i++)
{
if(!thro(i))
break;
}
return i;
}
void func()
{
int i, j;
int res;
for(i = 0; i < n; i++)
{
for(j = i+1; j < n; j++)
{
line.x1=x[i];
line.y1=y[i];
line.x2=x[j];
line.y2=y[j];
res=cnt();
if(result<res)
{
result=res;
dis=distance();
}
line.x1=x[i];
line.y1=y[i];
line.x2=x[j];
line.y2=y[j]-1;
res=cnt();
if(result<res)
{
result=res;
dis=distance();
}
line.x1=x[i];
line.y1=y[i]-1;
line.x2=x[j];
line.y2=y[j];
res=cnt();
if(result<res)
{
result=res;
dis=distance();
}
line.x1=x[i];
line.y1=y[i]-1;
line.x2=x[j];
line.y2=y[j]-1;
res=cnt();
if(result<res)
{
result=res;
dis=distance();
}
}
}
}
int main()
{
while(scanf("%d", &n)!=EOF)
{
if(n == 0)
break;
result=0;
dis=0;
int i;
for(i = 0; i < n; i++)
{
scanf("%lf%lf", &x[i], &y[i]);
}
func();
/* line.x1=0,line.y1=1,line.x2=4,line.y2=1;
int xx=thro(3);
printf("%d\n",xx);*/
if(result < n)
printf("%.2f\n",dis);
else
printf("Through all the pipe.\n");
}
return 0;
}