| ||||||||||
| 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 | |||||||||
偶都快吐血了,黑书上的题目今天死活写不过。。。 大牛,HELP~~~#include <stdio.h>
#include <math.h>
typedef struct {
double x, y;
}point;
int dblcmp (double d) //判断d的符号
{
if (fabs (d) < 1e-6) return 0;
return (d > 0) ? 1 : -1;
}
void getline (point a, point b, double &k, double &t, double &c)
{ //根据点a,b求直线kx+ty+c=0
k = a.y - b.y;
t = b.x - a.x;
c = a.x*b.y - b.x*a.y;
return ;
}
int cal (double k, double t, double c, point a)
{//计算点a在直线kx+ty+c=0的上方还是下方还是直线上
return dblcmp (k*a.x + t*a.y + c);
}
int n;
const int size = 21;
point up[size], down[size];
double max;
void updata (double k, double t, double c, point a, point b)
{ //更新最大值
double k2, t2, c2;
getline (a, b, k2, t2, c2);
double xp = (t*c2 - t2*c) / (k*t2 - t*k2);
double dist;
dist = (xp - up[0].x) * sqrt ((k*k)/(t*t) + 1);
if (dist > max) max = dist;
return ;
}
bool judge (point a, point b)
{ // 判断点a,b构成的直线是否能通过整条管道
double k, t, c;
getline (a, b, k, t, c);
//判断光线能够从第一个通道口射入
if (cal(k, t, c, up[0]) * cal(k, t, c, down[0]) > 0) return false;
int i;
//寻找第一个拐角,在这个拐角前,光线已穿越管壁
for (i = 1; i < n; i++)
if (cal(k, t, c, up[i]) * cal(k, t, c, down[i]) > 0) break;
if (i == n) return true;
if (cal(k, t, c, up[i]) * cal(k, t, c, up[i-1]) <= 0) updata (k, t, c, up[i], up[i-1]);
if (cal(k, t, c, down[i]) * cal(k, t, c, down[i-1]) <= 0) updata (k, t, c, down[i], down[i-1]);
return false;
}
bool solve ()
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++){
if (i == j) continue;
if (judge (up[i], down[j])) return true;
}
return false;
}
int main ()
{
// freopen ("in.txt", "r", stdin);
while (scanf ("%d", &n), n){
for (int i = 0; i < n; i++){
scanf ("%lf%lf", &up[i].x, &up[i].y);
down[i].x = up[i].x; down[i].y = up[i].y - 1;
}
max = 0;
if (solve ()) printf ("Through all the pipe.\n");
else printf ("%.2f\n", max);
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator