题目链接
http://poj.org/problem?id=3512
题意
给出一系列点,求点所连成的每一条线段所含的点的个数的最大值
题解
先将所有点按照横纵坐标排序,然后对于每一个点,计算该点和其他点所连成线段的斜率,斜率相同的线段即可认为在同一条直线上。输入格式较麻烦,可以使用sscanf函数读入。
sscanf函数的使用姿势
sscanf(“要读取的字符串”,“要读取的内容”);
贴一个dalao的科普贴:http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html
注意的地方
可能会有坐标相同的点
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;
struct node
{
int x,y;
double k;
}nodes[2000];
char s[10000];
int cmp(const node &a, const node &b)
{
if(a.x == b.x)return a.y < b.y;
return a.x < b.x;
}
double hasaki[1000005];
int main()
{
int x,y,cnt;
int lalala = 1;
while(gets(s))
{
cnt = 0;
if(s[0] == '-' && s[1] == '-')break;
sscanf(s,"%d%d",&nodes[cnt].x, &nodes[cnt].y);
cnt++;
while(gets(s))
{
if(s[0] == '-' && s[1] == '-')break;
sscanf(s,"%d%d",&nodes[cnt].x, &nodes[cnt].y);
cnt++;
}
sort(nodes,nodes+cnt,cmp);
int ans = 0;
for(int i = 0 ; i < cnt; i++)
{
int cases = 0;
int maxn = 0;
int vertex = 0;
int add = 0;
for(int j = i + 1; j < cnt; j++)
{
double yy = (double)(nodes[j].y - nodes[i].y);
double xx = (double)(nodes[j].x - nodes[i].x);
if(yy == 0 && xx == 0)
{
add++;
}
else if(xx == 0&&yy!=0)
{
vertex++;
}
else
{
double k = yy/xx;
hasaki[cases++] = k;
}
}
sort(hasaki,hasaki+cases);
int temp = 1;
//cout << vertex << endl;
maxn = (vertex,maxn);
for(int k = 1; k < cases; k++)
{
if(hasaki[k] == hasaki[k-1])
{
temp++;
}
else
{
maxn = max(maxn,temp);
temp = 1;
}
}
maxn = max(maxn,temp);
ans = max(ans,maxn+add);
}
printf("%d. %d\n", lalala++, ans+1);
}
return 0;
}