天天看點

給定一個二維平面,平面上有 n 個點,求最多有多少個點在同一條直線上。

需求:給定一個二維平面,平面上有 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)
#輸出去重完畢後的清單,再經過一次周遊即可找出最多點所在的直線