給定一個二維平面,平面上有 n 個點,求最多有多少個點在同一條直線上。
阿新 • • 發佈:2018-12-26
需求:給定一個二維平面,平面上有 n 個點,求最多有多少個點在同一條直線上。
分析思路:
1、將所有點二維座標化,即定義出所有點的x,y座標值
2、遍歷出所有取出兩點的情況(不考慮先後順序),根據任意兩點都確定一條直線,直線引數為k斜率,b與y軸交點的縱座標(此時x=0),將他們放入一個列表中
3、將所有直線放入一個集合並完成去重操作,增加直線的第三個引數n=0用於第四步判斷每條直線上有幾個點
4、將所有點遍歷並判斷是否在集合中的直線上,若在直線上,則直線對應的n加1
5、遍歷所有代表直線的列表,取出n最大的直線其n值就是最多有n個點在此條直線上
def line(point1, point2): #定義一個函式通過兩點來計算出對應直線的引數, #傳入的引數point1、point2都是列表 try: y1 = point1[1] y2 = point2[1] x1 = point1[0] x2 = point2[0] #根據列表對應下標取出x、y值 k = (y2-y1)/(x2-x1) #根據x、y值計算出斜率,當斜率無窮大時報錯,進入except b = y1-k*x1 #計算出b return [k, b,0] #返回直線引數,第三個引數為0,用來後面的計數 except Exception: return ["+8", y1, 0] #當報錯時意味著斜率為無窮大,我們用"+8"代替 def judge_in(point_in, line_in): #用來判斷點是否在直線上,若在則返回True, #若不在則返回False x_in = point_in[0] y_in = point_in[1] k_in = line_in[0] b_in = line_in[1] if k_in == "+8": #當斜率無窮大時,單獨判斷 if b_in == y_in: return True else: return False elif y_in == x_in*k_in+b_in: return True else: return False """可以改變下方列表中點的引數""" point_list = [[1, 1], [3, 2], [5, 3], [4, 1], [2, 3], [1, 4]] #給出一個包含幾個點的列表 # point_list = [[1,1],[2,2],[3,3]] line_list = [] #新建一個用來接收直線的空列表 new_list = [] #直線去重後加入此列表 for i in range(len(point_list)): for j in range(i+1, len(point_list)): #通過雙層的for迴圈給出所有兩個點的組合 line_s = line(point_list[i], point_list[j]) #利用函式求出直線的前兩個引數 line_list.append(line_s) print(line_list) #得到的是一組有重複引數的直線 for k in line_list: if k not in new_list: #去重 new_list.append(k) for m in point_list: for n in new_list: #遍歷所有點和線,判斷點是否在線上, #若在則直線第三個用來計數的引數加1 if judge_in(m, n): n[2] += 1 print(new_list) #輸出去重完畢後的列表,再經過一次遍歷即可找出最多點所在的直線