最多星星在同一条直线

lishenming8 2012-10-26 04:03:41
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


#include <iostream>

using namespace std;

int maxnum(double r[], int t);
int main()
{
int n, i, j, max, num, t;
double a[400][3];
double b[400];
while (cin>>n)
{
max = 0;
for (i = 0; i < n; i++)
{
cin>>a[i][0]>>a[i][1];
}
if (n == 0 || n == 1 || n == 2)
{
cout<<n<<endl;
continue;
}
for (i = 0; i < n; i++)
{
num = 0;
for (j = i + 1; j < n; j++)
{
if (a[i][0] == a[j][0])
{
b[num++] = 100000.0;
}
else b[num++] = (a[i][1] - a[j][1]) / (a[i][0] - a[j][0]);
}
t = maxnum(b, num);
if (max < t)
{
max = t;
}
if (max > n / 2)
{
break;
}
}
cout<<max+1<<endl;
}
return 0;
}

int maxnum(double r[], int t)
{
int i, j, count, temp;
temp = 0;
for (i = 0; i < t - 1; i++)
{
count = 1;
for (j = i + 1; j < t ; j++)
{
if ((r[i] - r[j] <= 0.00001)&&(r[i] - r[j] >= -0.00001))
{
count++;
}
}
if (temp < count)
{
temp = count;
}
}
return temp;
}
谁能帮我看看错在哪不?
...全文
353 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
KayGuoWhu 2012-11-16
  • 打赏
  • 举报
回复
引用 6 楼 lishenming8 的回复:
没有人么。。。
求这题思路大致分析。
lishenming8 2012-10-27
  • 打赏
  • 举报
回复
没有人么。。。
lishenming8 2012-10-27
  • 打赏
  • 举报
回复
哎 还是自己解决啦
if ((r[i] - r[j] <= 0.00001)&&(r[i] - r[j] >= -0.00001)) //这里出错啦

应该直接用等号进行比较的, 我要的是完全相等。
lishenming8 2012-10-26
  • 打赏
  • 举报
回复
额 。。话说好像我们的算法一样的。。。

我实验了好几组数据也都对的

但是在woj就是过不了。。。

郁闷。。。
stuniversity 2012-10-26
  • 打赏
  • 举报
回复
我按照你说的编了个程序,你看看符不符合
[code=C/C++]
[
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

typedef struct
{
double x;
double y;
}pos;

int main ()
{
ifstream ifs("input.dat");
for(;;)
{
int n;
ifs>>n;
if(!ifs)break; //读取失败则跳出for循环
vector<pos> stars(n);
for(int i=0;i<n;i++)
{
ifs>>stars[i].x;
ifs>>stars[i].y;
}
int max=0,num;
pos base,test;
for(i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++) //
//这两重for循环是为了取两个点作基准
//思路是:首先取stars[1]作第一个基准点,然后先后取stars[2]、satrs[3]...作第二个基准点
//接下来取stars[2]作第一个基准点,取stars[3]、stars[4]...作第二个基准点
//以此循环,保证n个星星中两两组成的直线都被选中过
//当选中基准点后,再判断剩下的n-2个点是否与此两基准点共线
{
num=2;
base.x=stars[j].x-stars[i].x;
base.y=stars[j].y-stars[i].y; //base可以看作两个基准点组成的向量
for(int k=0;k<n;k++)
{
if(k!=i && k!=j)
{
test.x=stars[k].x-stars[i].x;
test.y=stars[k].y-stars[i].y; //test可以看作一个基准点与其它点组成的向量
double result=base.x*test.y-base.y*test.x; //采用向量共线的方法判断
if(result>=-0.0001 && result<=0.0001) //其它点是否与两个基准点共线
num++;
}
}
if(max<num)max=num;
}
}
cout<<max<<endl;
}

ifs.close();
return 0;
}
]
我再在工作目录下弄了个input.dat文件,里面的数据如下:
5
0 0
1 0
1 1
0 1
0.5 0.5
10
1 1
2 2
3 3
0 0
1 2
1 3
1 4
5 6
7 8
9 10
则运行后,输出:
3
4
lishenming8 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

只判断斜率相等是不行的,

也许这2条直线是平行的,斜率相等,但是不在一条直线上。

得加上该斜率到原点的距离,斜率相等,距离相等,才是一条直线。
[/Quote]

你看看我代码 我不只是判断斜率好不
我每次都有一个公共点a[i] 就只需要判断斜率啦
十八道胡同 2012-10-26
  • 打赏
  • 举报
回复
只判断斜率相等是不行的,

也许这2条直线是平行的,斜率相等,但是不在一条直线上。

得加上该斜率到原点的距离,斜率相等,距离相等,才是一条直线。
lishenming8 2012-10-26
  • 打赏
  • 举报
回复
http://acm.whu.edu.cn/learn/problem/detail?problem_id=1087
这是题目链接

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧