具体算法在《算法艺术与信息学竞赛》里有讲。

#include <stdio.h>
#include 
<float.h>

int n;

double x[32];
double y[32];

double xintersect(double x0, double y0, double x1, double y1,
    
double xp, double yp, double k)
{
    
return ((k * xp + y0 - yp) * (x1 - x0) + x0 * (y0 - y1)) / (k * (x1 - x0) + (y0 - y1));
}


double check(double x0, double y0)
{
    
int i;
    
double k1, k2, l1, l2;
    
    k1 
= -DBL_MAX;
    k2 
= +DBL_MAX;

    
for (i = 0; i < n; i++)
    
{
        
if(x[i] == x0)
            
continue;

        l1 
= ((y[i] - 1.0- y0) / (x[i] - x0);
        l2 
= (y[i] - y0) / (x[i] - x0);
        
        
if (l1 > l2)
        
{            
            
if ((l1 < k1) || (l2 > k2)) return x[0];

            
if (l1 < k2) k2 = l1;
            
if (l2 > k1) k1 = l2;
        }

        
else
        
{
            
if (l1 > k2)
                
return xintersect(x[i - 1], y[i - 1- 1.0, x[i], y[i] - 1.0, x0, y0, k2);

            
if (l2 < k1)
                
return xintersect(x[i - 1], y[i - 1], x[i], y[i], x0, y0, k1);
                
            
if (l2 < k2) k2 = l2;
            
if (l1 > k1) k1 = l1;
        }

    }


    
return x[n - 1];
}


int main()
{
    
int i;
    
double c, r;

    
for(;;)
    
{
        scanf(
"%d"&n);

        
if (!n) break;

        
for (i = 0; i < n; i++)
        
{
            
float xf, yf;

            scanf(
"%f%f"&xf, &yf);

            x[i] 
= xf;
            y[i] 
= yf;
        }


        r 
= x[0];

        
for (i = 0; i < n; i++)
        
{
            c 
= check(x[i], y[i]);
            
if (c > r) r = c;

            c 
= check(x[i], y[i] - 1.0);
            
if (c > r) r = c;

            
if (r == x[n - 1]) break;
        }


        
if(r == x[n - 1]) printf("Through all the pipe.\n");
        
else printf("%.2f\n", r);
    }

    
return 0;
}
posted on 2007-09-09 22:01 Felicia 阅读(774) 评论(0)  编辑 收藏 引用 所属分类: 计算几何