大神们帮忙看下这个题目 我哪里写错了吧……
题目:
Description
“我该怎么办?”飞行员klux向你求助。 事实上,klux面对的是一个很简单的问题,但是他实在太菜了。 klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。 不限定起飞地点
Input
输入数据由n对整数组成(1<n<700),每对整数表示一个点的坐标。没有一个点会出现两次。
Output
一个整数,表示一条直线能覆盖的最多的点数。
Sample Input
5
1 1
2 2
3 3
9 10
10 11
Sample Output
3
我是这样写的:
#include<stdio.h>
int x[700],y[700];
int main()
{
int i,j,t;
int n,a=0,b=0,max=0,maxa=0,maxb=0,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&x[i],&y[i]); //横坐标为x,纵坐标为y
if(y[i]>maxb) //确定出x,y的最大范围
maxb=y[i];
if(x[i]>maxa)
maxa=x[i];
}
for(i=0;i<=maxa;i++) //统计横坐标一样的点的个数
{
a=0;
for(j=0;j<n;j++)
{
if(x[j]==i)
a++;
}
if(a>max)
max=a;
}
for(i=0;i<=maxb;i++) //统计纵坐标一样的点 的个数
{
a=0;
for(j=0;j<n;j++)
{
if(y[j]==i)
a++;
}
if(a>max)
max=a;
}
for(i=0;i<n;i++) //统计 横纵坐标一样的点的个数
{
if(x[i]==y[i])
sum++;
if(sum>max)
max=sum;
}
for(i=1;sum<n;i++) //统计向右倾斜的直线上的点数,横纵坐标的差值一致的为一条直线
{
a=0;
b=0;
for(j=0;j<n;j++)
{
if(x[j]-y[j]==i)
a++;
}
sum+=a;
if(a>max)
max=a;
for(j=0;j<n;j++)
{
if(y[j]-x[j]==i)
b++;
}
sum+=b;
if(b>max)
max=b;
}
for(i=0,j=maxa;j>=0;j--) //统计向左倾斜的直线上的点的个数。
{
a=0;
for(t=0;t<n;t++)
{
if((x[t]-0)==(j-y[t]))
a++;
}
if(a>max)
max=a;
}
for(i=0,j=maxa;i<=maxb;i++)
{
a=0;
for(t=0;t<n;t++)
{
if((x[t]-i)==(maxa-y[t]))
a++;
}
if(a>max)
max=a;
}
printf("%d\n",max); //输出一条直线上最多点的个数。
return 0;
}