题目描述
一天,小明坐在院子里数星星,Gardon就出了个难题给他,让他数数天上的星星最多有多少个是在同一条直线上的。天上的星星太多了,小明马上就看花了眼,你能写个程序来帮他计算么?
输入
首先输入一个整数N(N<=300),接下来的N对数每对表示一个星星的位置(星星的坐标在-10000到10000之间,精确到小数点后1位)。没有两个星星会在同一个位置。
输出
一个整数,表示一条直线上最多星星的数目。
样例输入 Copy
0 0
1 0
1 1
0 1
0.5 0.5
样例输出 Copy
3
来源/分类
代码:
//就三百组点,全给试一遍就完事了
#include<stdio.h>
struct star
{
double x, y;
}s[301];
int main()
{
int n;
int i, j, t, answer;
int m, max = 2;
double k;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%lf %lf", &s[i].x, &s[i].y);
for (i = 0; i < n - 1; i++)//每次选两个点,遍历所有可能的直线
{
for (j = i+1; j < n; j++)
{
m = 2;//两点确定一条直线,至少有两个点在一条直线上
answer = 1;//记录斜率的状况
if (s[i].x != s[j].x)
k = (s[i].y - s[j].y) / (s[i].x - s[j].x);//有斜率的话,套斜率公式求斜率
else
answer = 0;//没有的话,记录斜率状态
if (answer == 1)
{
for (t = 0; t < n; t++)//遍历出点i,j外的所有点,寻找在当前判断的这条直线上的点
if (t != i && t != j)
if (s[t].y - s[i].y == k * (s[t].x - s[i].x))//公式原型:y-y0=k(x-x0);
m++;
}
else
{
for (t = 0; t < n; t++)
if (t != i && t != j)
if (s[t].x == s[i].x)//只要横坐标相等,就在线上
m++;
}
if (m > max)
max = m;
}
}
printf("%d", max);
return 0;
}