时间限制:2888ms 内存限制:65536kb
通过率:590/785 (75.16%)
正确率:590/7070 (8.35%)
题目背景
Sheep在为自己制作测试数据时发现了自己能AC的代码但在运行自己做的测试数据时直接将编译器卡崩掉了,经过反复的寻找,发现导致最终运行不出来结果的数据在中间过程中的求交时发现了能在计算机的浮点数精度上也能三线共点的情况,于是Sheep就换用了另一种不会产生浮点数误差的方法求交,请你也来试试这种方法吧
题目描述
在xOyxOy上有三条无限长直线,方程的基本形式如下:
A1x+B1y+C1=0A2x+B2y+C2=0A3x+B3y+C3=0A1x+B1y+C1=0A2x+B2y+C2=0A3x+B3y+C3=0
你的任务是判断这三条直线是否会经过同一个点
输入
第一行,一个正整数n(1≤n≤106)n(1≤n≤106)表示数据组数
接下来一共3n3n行,对于第ii组数据(1≤i≤n)(1≤i≤n)
第3i−13i−1行,3个整数,表示A1 A1 ,B1 B1 ,C1C1
第3i3i行,3个整数,表示A2 A2 ,B2 B2 ,C2C2
第3i+13i+1行,3个整数,表示A3 A3 ,B3 B3 ,C3C3
输出
对每组数据
如果出现了3线共点的情况,输出一行一个字符串 Could be a bug!
对于一般情况,输出一行一个字符串 A nice test data ~
输入样例
2
1 -1 1
2 -1 -1
3 -1 -3
-194 611 520
-483 -425 -74
561 -756 -201
输出样例
Could be a bug!
A nice test data ~
Hint
对每个测试点 均有(1≤n≤106)(1≤n≤106)
对所有测试数据均有 −600≤Am,Bm,Cm≤600,1≤m≤3−600≤Am,Bm,Cm≤600,1≤m≤3且Am,Bm,1≤m≤3Am,Bm,1≤m≤3不同时为0
要注意可能产生的浮点数误差范围,避免机器产生过大的浮点数误差
或者选用不会浮点数误差的方法
测试点中可能会出现直线重合的情况,而三线重合时我们也认为发生了三线共点的状况
AUTHOR: Oh So many sheep
#include <stdio.h>
#include <math.h>
#include<string.h>
int main()
{
int n, i, A1, A2, A3, B1, B2, B3, C1, C2, C3;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%d%d%d%d%d%d%d%d%d", &A1, &B1, &C1, &A2, &B2, &C2, &A3, &B3, &C3);
if (A1*B2 == A2*B1 && A1*B3 == A3*B1)//三条线斜率都相等
{
if ((A1*C2 == A2*C1 && B1*C2 == B2*C1) && (A1*C3 == A3*C1 && B1*C3 == B3*C1))//三条线重合,则共点
printf("Could be a bug!\n");
else//三条线不都重合,则不共点
printf("A nice test data ~\n");
}
else if (A1*B2 == A2*B1)//12 斜率相等,不与3相等
{
if ((A1*C2 == A2*C1) && (B1*C2 == B2*C1))//12重合
printf("Could be a bug!\n");
else
printf("A nice test data ~\n");
}
else if (A1*B3 == A3*B1)
{
if ((A1*C3 == A3*C1) && (B1*C3 == B3*C1))
printf("Could be a bug!\n");
else
printf("A nice test data ~\n");
}
else if (A2*B3 == A3*B2)
{
if ((A2*C3 == A3*C2) && (B2*C3 == B3*C2))
printf("Could be a bug!\n");
else
printf("A nice test data ~\n");
}
else
{
if (A1*(B2*C3 - B3*C2) - B1*(A2*C3 - A3 * C2) + C1*(A2 * B3 - A3 * B2) == 0)
printf("Could be a bug!\n");
else
printf("A nice test data ~\n");
}
}
return 0;
}