一、轰炸问题
1、 依次用两点确定一条直线,判断后面的点是否在直线上。
2、 直线方程:(y-y1)/(x-x1)=(y2-y1)/(x2-x1)
3、 为了防止除数为0,将方程式变形(交叉相乘):
(y-y1)(x2-x1)=(y2-y1)(x-x1)
/*
轰炸
输入文件: "bomb.in" 输出文件: "estdout.pc2"
问题描述
"我该怎么办?"飞行员klux向你求助。事实上,klux面对的是一个很简单的问题,但是他实在太菜了。klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。
输入
输入由若干组数据构成,每组数据的第一行是整数n,然后是n行整数对组成(1<n<700),每对整数表示一个点的坐标,且没有一个点会出现两次。当n为0时表示输入结束。
输出
针对每组数据输出一个整数,它表示一条直线能覆盖的最多的点数。
输入样本
5
1 1
2 2
3 3
9 10
10 11
0
输出样本
3
【程序说明】
1、两点确定一条直线
2、点点式直线方程确定直线
3、带入法判断第三点在不在直线上
4、转除法为加法
*/
#include<stdio.h>
#include "stdlib.h"
struct point
{
int x,y;
} a[700];//平面上的点
int main()
{
int n, maxPoint, xa, xb, xc, ya, yb, yc, tem;//n:点数 maxPoint:最大点数 tem:每条直线上的点
maxPoint = 0;
scanf("%d", &n);
for (int i = 0; i <= n-1; ++i)
{
scanf("%d%d", &a[i].x, &a[i].y);
}
for (i = 0; i <= n-3; ++i)
{
for (int j = i+1; j <= n-2; ++j)
{
tem=2;
xa=a[i].x; //起点x坐标
ya=a[i].y; //起点y坐标
xb=a[j].x; //终点x坐标
yb=a[j].y; //终点y坐标
for (int k=j+1; k<=n-1; ++k)
{
xc=a[k].x;
yc=a[k].y;
if ((yb-ya)*(xc-xa) == (yc-ya)*(xb-xa))//斜率相等
{
++tem;//点数加加
}
}
if (tem > maxPoint)
{
maxPoint = tem;
}
}
}
printf