zoukankan      html  css  js  c++  java
  • PKU1039

    几何题

    #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;
    }

                    
  • 相关阅读:
    森田疗法
    “不支持一个STA线程上针对多个句柄的WaitAll。”的解决方案
    烽火HG226信息
    祝贺小牛队得NBA总冠军
    .net4调用非托管代码出现:PInvoke调用导致堆栈不对称
    大怪路子逻辑
    C#内存复制与比较
    【收藏】UDP广播和多播
    Objectivec NSString
    Objectivec NSDictionary(NSMutableDictionary)
  • 原文地址:https://www.cnblogs.com/SQL/p/897746.html
Copyright © 2011-2022 走看看