紧急求助!!!直角坐标系的m个点,求同一条直线所能通过的最多点数

crazylinuxer 2009-10-15 11:52:55
已知平面上(直角坐标系)的m个点,请编写一个函数,求同一条直线所能通过的最多点数。
谢谢各位啦!
...全文
413 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
abigwc 2012-01-01
  • 打赏
  • 举报
回复
我一个师姐也要考南师大,我来帮忙看看这些题,呵呵!
zxbing 2011-12-20
  • 打赏
  • 举报
回复
你是考研要用吧?
crazylinuxer 2009-12-09
  • 打赏
  • 举报
回复
还有没有哪位可以再给出答案的?
crazylinuxer 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ldpong 的回复:]
楼主莫非是要考南师大的研究生?
[/Quote]
呵呵!Yep~
fire_woods 2009-10-21
  • 打赏
  • 举报
回复
楼上的如何推测出来的?
ldpong 2009-10-20
  • 打赏
  • 举报
回复
楼主莫非是要考南师大的研究生?
crazylinuxer 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baihacker 的回复:]
C/C++ code#include<iostream>
#include<deque>
#include<vector>
#include<map>usingnamespace std;struct POINT
{int dy, dx;
POINT(int _dy=0,int _dx=0) : dy(_dy), dx(_dx){}
};intoperator< (const POINT&¡­
[/Quote]
Thank you sir ~
baihacker 2009-10-17
  • 打赏
  • 举报
回复
#include <iostream>
#include <deque>
#include <vector>
#include <map>
using namespace std;

struct POINT
{
int dy, dx;
POINT(int _dy=0, int _dx = 0) : dy(_dy), dx(_dx){}
};
int operator < (const POINT& a, const POINT& b)
{
return a.dy < b.dy || a.dy==b.dy && a.dx<b.dx;
}
int gcd(int a, int b)
{
return b ? gcd(b, a% b) : a;
}

int data[1005][2];
int main(void)
{
int n;
while (scanf("%d", &n) == 1)
{

for (int i = 0; i < n; ++i)
{
scanf("%d%d",&data[i][0],&data[i][1]);
}
int m = -1;
for (int i = 0; i < n; ++i)
{
map<POINT, int> mp;
int s = 0;
int same = 0;
for (int j = i+1; j < n; ++j)
{
int dy = data[j][1] - data[i][1];
int dx = data[j][0] - data[i][0];
if (dx == 0 && dy == 0)
{
++same;continue;
}
int g = gcd(dx, dy);
if (g != 0)
{
dy /= g;
dx /= g;
}
if (dy < 0)
{
dy = -dy;
dx = -dx;
}
if (dx == 0) dy = 1;
if (dy == 0) dx = 1;
POINT t(dy,dx);
int k = ++mp[t];
s >?= k;
}
m >?= s+same+1;
}
printf("%d\n", m);

}
return 0;
}
crazylinuxer 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 baihacker 的回复:]
固定一个点x,然后其它点和这个固定连就可以有一条直线,这条直线就可以用斜率表示,注意到斜率不存在的情况,所以用二元组(a, b)表示,要求b>=0,且gcd(a, b) = 1.这样就是唯一的了。
这样就能计算出通过点x能作出的直线,最多通过的点数。
这样的话算法复杂度就是m*m*logm
[/Quote]
好厉害!佩服佩服~~~~
能不能帮忙用代码表示出来?
谢谢谢谢啊~!~!~!
baihacker 2009-10-17
  • 打赏
  • 举报
回复
固定一个点x,然后其它点和这个固定连就可以有一条直线,这条直线就可以用斜率表示,注意到斜率不存在的情况,所以用二元组(a, b)表示,要求b>=0,且gcd(a, b) = 1.这样就是唯一的了。
这样就能计算出通过点x能作出的直线,最多通过的点数。
这样的话算法复杂度就是m*m*logm
crazylinuxer 2009-10-17
  • 打赏
  • 举报
回复
高手来看看啊!
不晓得怎么解决呢~~~

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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