NC220476. 线段的交
描述
输入描述
输入共四行,每行给出一个坐标,前两行代表第一条线段,后两行代表第二条线段
每行座标都包含了两个实数,所有的座标皆满足 ,数值固定精准到小数点下第三位。
输入保证,四个座标一定两两相异,不会有任何一个坐标在另两个坐标的连线上。
输出描述
在一行中输出一个非负实数表示面积,输出的答案与正确答案误差在 内皆视为正确
示例1
输入:
2.000 0.000 -1.000 0.000 0.000 1.000 0.000 -1.000
输出:
3.0000000
示例2
输入:
24.152 31.428 13.505 17.779 14.240 32.285 22.130 12.326
输出:
160.0970415000
示例3
输入:
1.500 1.500 1.500 -1.500 -1.500 -1.500 -1.500 1.500
输出:
0
Python3(3.9) 解法, 执行用时: 45ms, 内存消耗: 6924K, 提交时间: 2021-04-28 21:06:01
def cal(x1, y1, x2, y2, x3, y3): return x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 + x3 * y1 - x1 * y3 if __name__ == '__main__': x1, y1 = map(float, input().split(' ')) x2, y2 = map(float, input().split(' ')) x3, y3 = map(float, input().split(' ')) x4, y4 = map(float, input().split(' ')) # print(x1, y1, x2, y2, x3, y3, x4, y4) t3 = cal(x1, y1, x2, y2, x3, y3) t4 = cal(x1, y1, x2, y2, x4, y4) t1 = cal(x3, y3, x4, y4, x1, y1) t2 = cal(x3, y3, x4, y4, x2, y2) if t1 * t2 < 0 and t3 * t4 < 0: print((abs(t1) + abs(t2)) / 2) else: print(0)
C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 508K, 提交时间: 2022-08-03 21:42:05
#include<bits/stdc++.h> using namespace std; double x1,x2,y111,y2,x11,x22,y11,y22,l,l1; int main() { cin>>x1>>y111>>x11>>y11>>x2>>y2>>x22>>y22; if ((x1*y11+x2*y111+x11*y2-x1*y2-x2*y11-x11*y111)*(x1*y11+x22*y111+x11*y22-x1*y22-x22*y11-x11*y111)<=0 &&(x22*y11+x2*y22+x11*y2-x22*y2-x2*y11-x11*y22)*(x1*y2+x22*y111+x2*y22-x1*y22-x22*y2-x2*y111)<=0) { l=fabs(x1*y11+x2*y111+x11*y2-x1*y2-x2*y11-x11*y111)/2; l1=fabs(x1*y11+x22*y111+x11*y22-x1*y22-x22*y11-x11*y111)/2; printf("%.8lf",l+l1); } else cout<<'0'; return 0; }