POJ 3668 Game of Lines

给定 n 个点,每个点都可以和另一个点相连,问你共有多少种不同斜率的直线。


细节:

1.用j=i+1减少循环次数,避免重复。
2.求斜率用y2-y1/x2-x1,考虑x2==x1斜率不存在的情况

呃,当时觉得用set比较好用,但是一直写错

set方法:

int main() {
    while (scanf ("%d", &n) == 1) {
        sets.clear();
        for (int i = 0; i < n; ++i) { scanf ("%d %d", &x[i], &y[i]); }
        for (int i = 0; i < n; ++i)
            for (int j = i+1; j < n; ++j)
                if (x[i] == x[j]) { sets.insert (inf); }
                else { sets.insert ( (y[i]-y[j]) *1.0/ (x[i]*1.0-x[j]*1.0) ); }
        printf ("%d\n", sets.size() );
    }
    return 0;
}

一般方式

利用排序,方便去重

struct point {
    double x,y;
} P[205];
double xl[25000];
int main() {
    int N;
    while (~scanf ("%d",&N) ) {
        for (int i=0; i<N; ++i) {
            scanf ("%lf%lf",&P[i].x,&P[i].y);
        }
        int L=0,ans=1/***/;
        for (int i=0; i<N-1; i++) {
            for (int j=i+1/***/; j<N; ++j) {
                if (P[i].x==P[j].x) {xl[L++]=INF;}/*!!*/
                else {
                    xl[L++]= (P[j].y-P[i].y) / (P[j].x-P[i].x);
                }
            }
        }
        sort (xl,xl+L);
        for (int i=1; i<L; ++i) {
            if (xl[i]!=xl[i-1]) { ans++; }
        }
        printf ("%d\n",ans);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值