E题遍历两个正方形的各顶点即可,当恰有一个顶点重合时公切线有无限条,注意需要唯一表示直线方程,如果用Ax+By+C=0表示需考虑约分,此处直接使用两两比值的元组表示,分母为零时取None值
from itertools import product from fractions import Fraction def square(x1,y1,x2,y2): yield x1,y1 yield x2,y2 cx,cy = Fraction(x1+x2,2),Fraction(y1+y2,2) for x,y in ((x1,y1),(x2,y2)): yield cx+cy-y,x-cx+cy def cross(x1,y1,x2,y2): return x1*y2-x2*y1 def div(x,y): return Fraction(x,y) if y else None def parse(x1,y1,x2,y2): # u*x+v*y+w == 0 u = y2-y1 v = x1-x2 w = -x1*u-y1*v return div(u,v),div(v,w),div(u,w) def main(): for _ in range(int(input())): x1,y1,x2,y2,x3,y3,x4,y4 = map(int,input().split()) s1 = list(square(x1,y1,x2,y2)) s2 = list(square(x3,y3,x4,y4)) if sum((u1,v1) == (u2,v2) for (u1,v1),(u2,v2) in product(s1,s2)) == 1: print("Infinity"); continue ans = set() for (u1,v1),(u2,v2) in product(s1,s2): if (u1,v1) == (u2,v2): continue du,dv = u2-u1,v2-v1 for s in (s1,s2): signs = [cross(du,dv,x-u1,y-v1) for x,y in s] if not (all(sign >= 0 for sign in signs)\ or all(sign <= 0 for sign in signs)): break else: ans.add(parse(u1,v1,u2,v2)) print(len(ans)) main()