1600 计算几何:数星星

本文介绍了一道计算几何题目——数星星,旨在找出天空中最多有多少颗星星位于同一直线上。通过枚举和叉积的方法,设计算法解决该问题,并给出了具体的实现代码。

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

计算几何:数星星
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit:72 Accepted:24
Description
一天,小希坐在院子里数星星,Gardon就出了个难题给她,让她数数天上的星星最多有多少个是在同一条直线上的。天上的星星太多了,小希马上就看花了眼,你能写个程序来帮她计算么?

Input
输入包含多组数据,每组数据的开头是一个整数N(N<=300),接下来的N对数每对表示一个星星的位置(星星的坐标在-10000到10000之间,精确到小数点后1位)。没有两个星星会在同一个位置。
Output
一个整数,表示一条直线上最多星星的数目。
Sample Input
5
0 0
1 0
1 1
0 1
0.5 0.5

Sample Output
3
Hint
枚举、叉积
类似 poj 1118


题解:两个点可以确定一条直线,那么N个点共有N×(N-1)条直线,那么怎么判断那些直线共线呢?
共线的直线有这样的特点:有一个相同的点,且斜率相同。所以可以设计这样的算法:
(1)如果点小于3,直接输出点数为结果
(2)以第一个为共同点
(3)计算其他点与它组成直线的斜率
(4)对斜率排序,统计其中斜率连续相同的最大数stars,并根据它相应个性最大Max
(5)以下一个点为共同点,转向(3)
(6)输出Max。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;

struct point
{
    double x,y;
}a[100];

double multi(point p0, point p1, point p2)
{
	//计算斜率,若斜率相减等于0,则斜率相等,即在同一直线上。 
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int main()

{
    int n,i,j,xa=0,b[100],k;

    while (cin>>n&&n)
    {  
       memset(b,0,sizeof(b));
        for (i=0;i<n;i++)
            cin>>a[i].x>>a[i].y;
            
        for (i=0;i<n-1;i++)
            for (j=i+1;j<n;j++)
            {
                for(k=0;k<n;k++)
                {
                    if (multi(a[i],a[j],a[k])==0)
                        b[xa]++;      //用数组b储存同斜率的直线的条数 
                }
                xa++;

            }
       
         sort(b,b+xa);
        cout<<b[xa-1]<<endl;

    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值