C 三线共点===bug?

时间限制: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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值