Python 覆盖所有点的最少线数(Minimum lines to cover all points)

示例图1 

示例图2 

        给定二维空间中的 N 个点,我们需要打印经过所有这 N 个点并且也经过特定 (xO, yO) 点的最少线数。

示例: 

        如果给定的点为 (-1, 3), (4, 3), (2, 1), (-1, -2), (3, -3) 且 (xO, yO) 点为 (1, 0),即每条线都必须经过此点。那么我们必须绘制至少两条线来覆盖所有经过 (xO, yO) 的点。

        我们可以通过考虑所有点的斜率(xO,yO)来解决这个问题。如果两个不同的点的斜率(xO,yO)相同,那么它们可以用同一条线覆盖,这样我们就可以跟踪每个点的斜率,每当我们得到一个新的斜率时,我们就将线数增加一。 

        在下面的代码中,斜率被存储为一对整数以消除精度问题,并使用一个集合来跟踪发生的斜率。 请参阅下面的代码以更好地理解。  

示例代码:

# Python3 program to get minimum lines to cover 
# all the points 
  
# Utility method to get gcd of a and b 
def gcd(a, b): 
    if (b == 0): 
        return a 
    return gcd(b, a % b) 
  
# method returns reduced form of dy/dx as a pair 
def getReducedForm(dy, dx): 
    g = gcd(abs(dy), abs(dx)) 
  
    # get sign of result 
    sign = (dy < 0) ^ (dx < 0) 
  
    if (sign): 
        return (-abs(dy) // g, abs(dx) // g) 
    else: 
        return (abs(dy) // g, abs(dx) // g) 
  
# /* method returns minimum number of lines to 
#     cover all points where all lines goes 
#     through (xO, yO) */ 
def minLinesToCoverPoints(points, N, xO, yO): 
      
    # set to store slope as a pair 
    st = dict() 
    minLines = 0
  
    # loop over all points once 
    for i in range(N): 
          
        # get x and y co-ordinate of current point 
        curX = points[i][0] 
        curY = points[i][1] 
  
        temp = getReducedForm(curY - yO, curX - xO) 
  
        # if this slope is not there in set, 
        # increase ans by 1 and insert in set 
        if (temp not in st): 
            st[temp] = 1
            minLines += 1
  
    return minLines 
  
# Driver code  
xO = 1
yO = 0
  
points =[[-1, 3], 
         [4, 3], 
         [2, 1], 
         [-1, -2], 
         [3, -3]] 
  
N = len(points) 
print(minLinesToCoverPoints(points, N, xO, yO)) 
  
# This code is contributed by mohit kumar 29  

输出: 
2

时间复杂度: O(N) 

辅助空间: O(N)

猜你喜欢

转载自blog.csdn.net/hefeng_aspnet/article/details/142522279