2014年山东省第五届ACM大学生程序设计竞赛Painting Cottages

    • 给你一个点集求能分割成几种不同的2个空间
    • 可以转化为求点集能有几条直线

    • 利用3点共线的思想 通过gcd来确定 一条直线最小两个点
    • 用的学长的思路和代码。。。
    #include <cstdio>  
    #include <map>  
    #define maxn 1005  
    using namespace std;  
    inline int gcd(int a,int b){return b==0?a:gcd(b,a%b);}  
    struct Point{  
        int x,y;  
        Point(){}  
        inline Point(int _x,int _y){  
            x=_x;  
            y=_y;  
        }  
        inline double lenx(const Point &b)const{  
            return x-b.x;  
        }  
        inline double leny(const Point &b)const{  
            return y-b.y;  
        }  
    }P[maxn];  
    int main(){  
        int n;  
        while(~scanf("%d",&n)){  
            for(int i=1;i<=n;++i){  
                int x,y;  
                scanf("%d%d",&x,&y);  
                P[i]=Point(x,y);  
            }  
            int ans=0;  
            for(int i=1;i<=n;++i){  
                map<pair<int ,int>,int> dp;  
                for(int j=i+1;j<=n;++j){  
                        int x=P[i].lenx(P[j]);  
                        int y=P[i].leny(P[j]);  
                        int z=gcd(x,y);  
                    if(!dp[make_pair(x/z,y/z)])dp[make_pair(x/z,y/z)]=++ans;  
                }  
            }  
            printf("%d\n",ans<<1);  
        }  
        return 0;  
    } 

猜你喜欢

转载自blog.csdn.net/clx55555/article/details/80032762