时间限制 1000 ms 内存限制 65536 KB
题目描述
Given points on a 2D plane, judge whether there're three points that locate on the same line.
输入格式
The number of test cases T(1≤T≤10) appears in the first line of input.
Each test case begins with the number of points N(1≤N≤100). The following N lines describe the coordinates (xi,yi) of each point, in accuracy of at most 3 decimals. Coordinates are ranged in [−104,104].
输出格式
For each test case, output Yes
if there're three points located on the same line, otherwise output No
.
输入样例
2
3
0.0 0.0
1.0 1.0
2.0 2.0
3
0.001 -2.000
3.333 4.444
1.010 2.528
输出样例
Yes
No
#include <stdio.h> #include <stdlib.h> #include <math.h> main() { int T, i, j, k, m, n, flag; double a[100], b[100]; scanf("%d",&T); while(T--){ flag=0; scanf("%d",&n); //n numbers scanf("%lf%lf%lf%lf",&a[0],&b[0],&a[1],&b[1]); for(m = 2; m <= n - 1; m++){ scanf("%lf%lf",&a[m],&b[m]); for(i=0;i<= m-2&&!flag;i++) { for(j = i+1; j <= m - 1;j++) { if(fabs(a[i]*b[j]-a[j]*b[i]+a[j]*b[m]-a[m]*b[j]+a[m]*b[i]-a[i]*b[m])<=1e-6) flag=1; } } } printf("%s ",flag?"Yes":"No"); //puts(flag?"Yes":"No"); } return 0; }
暴力突破:
读取组数T
while(T--)
{
读取第T组数点的个数N,和前两个点;
标识量清零(flag);
for( 2 <=m <= N-1,m++)
{
读取点m,a[m],b[m](x,y坐标);
/*开始已有点搜索,每暴力搜索一遍,都可能会影响flag,即已有数是否有三点共线,故在这里判断flag*/
for( i 从0到m-2)
{
for( j从1到m-1)
{ //判定公式
if(fabs(a[i]*b[j]-a[j]*b[i]+a[j]*b[m]-a[m]*b[j]+a[m]*b[i]-a[i]*b[m])<=1e-6) flag=1;
}
}
}
输出flag(Yes or No);
}
注意点:
逻辑层次
puts 和printf