POJ 3512 Incidental Points

本文介绍了一种通过计算平面中各点之间的斜率来找出共线点数量的算法。该算法遍历每一点作为坐标原点,计算其余点相对该原点的斜率,并统计斜率相同的点的数量。此外,还特别考虑了水平、垂直及重合点的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

1,分别以每个点为坐标原点,暴力找斜率一样的点的个数。

自我提醒:
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <algorithm>
#include <map>

typedef long long int lli;
using namespace std;

char s[100000];

int a[1010];
int b[1010];

int aa,bb;

int cnt;
double mm[1010];
int cntom;


int main(){
    int ncase = 0;
    int origin;
    int x,y;
    int ans;
    while(1){
        gets(s);
        ncase++;
        cnt = 1;
        if(s[1] == '-')
            break;
        sscanf(s,"%d%d",a,b);
        while(1){
            gets(s);
            if(s[1] == '-')
                break;
            sscanf(s,"%d%d",a+cnt,b+cnt);
            cnt++;
        }
        ans = 0;
        for(int i = 0;i < cnt;i++){
            cntom = 0;
            origin = 1;
            x = 0,y = 0;
            for(int j = i+1;j < cnt;j++){
                aa = a[j] - a[i];
                bb = b[j] - b[i];
                double temp;
                if(aa != 0 && bb != 0){
                    temp = (double)bb/aa;
                    mm[cntom++] = temp;
                }
                else if(aa == 0 && bb == 0){
                    origin++;
                }
                else if(aa == 0){
                    y++;
                }
                else{
                    x++;
                }
            }
            int temp = max(x,y);
            temp += origin;
            ans = max(ans,temp);

            sort(mm,mm+cntom);
            int jishu = 1;
            int maxjishu = 1;
            for(int j = 1;j < cntom;j++){
                if(mm[j] == mm[j-1] ){
                    jishu++;
                }
                else{
                    maxjishu = max(jishu,maxjishu);
                    jishu = 1;
                }
            }
            maxjishu = max(jishu,maxjishu); // 注意!!!
            ans = max(ans,maxjishu+origin);
        }
        printf("%d. %d\n",ncase,ans);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值