1600 计算几何:数星星

计算几何:数星星
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;
}



你可能感兴趣的:(计算几何,计算几何数星星)