1. 程式人生 > >給定一個二維平面,平面上有 n 個點,求最多有多少個點在同一條直線上。

給定一個二維平面,平面上有 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)
#輸出去重完畢後的列表,再經過一次遍歷即可找出最多點所在的直線