几何题
#include<math.h>
#include<string.h>
#include <stdio.h>
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
struct Point
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
double x,y;
};
![](/Images/OutliningIndicators/None.gif)
struct Line
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
double x1, y1;
double x2, y2;
};
int n;
double x[20],y[20];
Line line;
int result;
double dis;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
Point cut(Line l)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
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;
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
double ppdis(Point p1, Point p2)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
double distance()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
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;
![](/Images/OutliningIndicators/InBlock.gif)
Line line1, line2;
![](/Images/OutliningIndicators/InBlock.gif)
line1.x1=x[result-1];
line1.y1=y[result-1];
line1.x2=x[result];
line1.y2=y[result];
p2=cut(line1);
![](/Images/OutliningIndicators/InBlock.gif)
line2.x1=x[result-1];
line2.y1=y[result-1]-1;
line2.x2=x[result];
line2.y2=y[result]-1;
p3=cut(line2);
![](/Images/OutliningIndicators/InBlock.gif)
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;
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
bool thro(int i)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
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;
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
int cnt()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
int i;
for(i = 0; i < n; i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
if(!thro(i))
break;
}
return i;
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
void func()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
int i, j;
int res;
for(i = 0; i < n; i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
for(j = i+1; j < n; j++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
line.x1=x[i];
line.y1=y[i];
line.x2=x[j];
line.y2=y[j];
res=cnt();
if(result<res)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
result=res;
dis=distance();
}
![](/Images/OutliningIndicators/InBlock.gif)
line.x1=x[i];
line.y1=y[i];
line.x2=x[j];
line.y2=y[j]-1;
res=cnt();
if(result<res)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
result=res;
dis=distance();
}
![](/Images/OutliningIndicators/InBlock.gif)
line.x1=x[i];
line.y1=y[i]-1;
line.x2=x[j];
line.y2=y[j];
res=cnt();
if(result<res)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
result=res;
dis=distance();
}
![](/Images/OutliningIndicators/InBlock.gif)
line.x1=x[i];
line.y1=y[i]-1;
line.x2=x[j];
line.y2=y[j]-1;
res=cnt();
if(result<res)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
result=res;
dis=distance();
}
}
}
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
int main()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
while(scanf("%d", &n)!=EOF)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
if(n == 0)
break;
result=0;
dis=0;
int i;
for(i = 0; i < n; i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
scanf("%lf%lf", &x[i], &y[i]);
}
func();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//* 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;
}
|
|
|