• Benelux Algorithm Programming Contest 2016 Preliminary Target Practice


    题意:

    二维平面上若干个点,能否用两条直线,穿过所有的点

    前3个点要么在同一直线上,要么在2条直线上

    所以用前3个点里的任意两个点定好第一条直线

    然后判断剩余所有的点是否在这条直线或另一条直线上

    #include<cstdio>
    
    using namespace std;
    
    #define N 100001
    
    int n,x[N],y[N];
    
    bool solve(int a,int b,int c)
    {
        long long x0=x[b]-x[a],y0=y[b]-y[a],x1,y1,x2,y2;
        bool tag=false;
        for(int i=1;i<=n;++i)
        {
            if(i==c || i==b || i==a) continue;
            x1=x[i]-x[a];
            y1=y[i]-y[a];
            if(x0*y1-x1*y0)
                if(!tag)
                {
                    x2=x[c]-x[i];
                    y2=y[c]-y[i];
                    tag=true;
                }
                else
                {
                    x1=x[c]-x[i];
                    y1=y[c]-y[i];
                    if(x1*y2-x2*y1) return false;
                }
        }
        return true;
    }
    
    int main()
    {
    //    freopen("bigsuccess3.in","r",stdin); 
        scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%d%d",&x[i],&y[i]);
        if(n<=4)
        {
            printf("success");
            return 0;
        }
        int a,b,c=3;
        long long x0=x[1]-x[2],y0=y[1]-y[2],xx,yy;
        for(int i=3;i<=n;++i)
        {
            xx=x[i]-x[1];
            yy=y[i]-y[1];
            if(x0*yy-xx*y0)
            {
                c=i;
                break;
            }
        }
        a=1;
        b=2;
        if(solve(a,b,c) || solve(b,c,a) || solve(c,a,b)) printf("success");
        else printf("failure"); 
        return 0;
    }
    作者:xxy
    本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。
  • 相关阅读:
    20201016---不做清单
    20201014--增删改查
    20201013--什么是真实的自己?
    多态
    继承
    关键字
    分类思想
    常用的linux命令
    九九乘法表
    稀疏数组
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/13637653.html
Copyright © 2020-2023  润新知