Shopee物流会有很多个中转站。在选址的过程中,会选择离用户最近的地方建一个物流中转站。
假设给你一个二维平面网格,每个格子是房子则为1,或者是空地则为0。找到一个空地修建一个物流中转站,使得这个物流中转站到所有的房子的距离之和最小。 能修建,则返回最小的距离和。如果无法修建,则返回 -1。
若范围限制在100*100以内的网格,如何计算出最小的距离和?
当平面网格非常大的情况下,如何避免不必要的计算?
Shopee物流会有很多个中转站。在选址的过程中,会选择离用户最近的地方建一个物流中转站。
假设给你一个二维平面网格,每个格子是房子则为1,或者是空地则为0。找到一个空地修建一个物流中转站,使得这个物流中转站到所有的房子的距离之和最小。 能修建,则返回最小的距离和。如果无法修建,则返回 -1。
若范围限制在100*100以内的网格,如何计算出最小的距离和?
当平面网格非常大的情况下,如何避免不必要的计算?
4
0 1 1 0
1 1 0 1
0 0 1 0
0 0 0 0
先输入方阵阶数,然后逐行输入房子和空地的数据,以空格分隔。
8
能修建,则返回最小的距离和。如果无法修建,则返回 -1。
4 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0
8
4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-1
# 二维前缀和 if __name__ == '__main__': n = int(input()) l = [] for _ in range(n): line = input() l.append(list(map(int, line.split()))) dp = [[0 for _ in range(n)] for _ in range(n)] dp[0][0] = l[0][0] dist_init = 0 ones = int(l[0][0] == 1) for i in range(1,n): if l[0][i] == 1: dist_init += i ones += 1 if l[i][0] == 1: dist_init += i ones += 1 dp[0][i] = dp[0][i-1] + l[0][i] dp[i][0] = dp[i-1][0] + l[i][0] for i in range(1,n): for j in range(1,n): if l[i][j] == 1: dist_init += i + j ones += 1 dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + l[i][j] if ones == n: print(-1) res = dist_init dist = [[0 for _ in range(n)] for _ in range(n)] dist[0][0] = dist_init for i in range(1,n): dist[i][0] = dist[i-1][0] + dp[i-1][-1] - (ones - dp[i-1][-1]) dist[0][i] = dist[0][i-1] + dp[-1][i-1] - (ones - dp[-1][i-1]) if l[i][0] == 0 and dist[i][0] < res: res = dist[i][0] if l[0][i] == 0 and dist[0][i] < res: res = dist[0][i] for i in range(1,n): for j in range(1,n): dist[i][j] = dist[i-1][j] + dp[i-1][-1] - (ones - dp[i-1][-1]) if l[i][j] == 0 and dist[i][j] < res: res = dist[i][j] print(res)
def cal_distance(matrix, x_center, y_center): real_x_center, real_y_center = 0, 0 max_distance = n * 2 # 矩阵两点间的最大距离 for i in range(n): # 求在理想中心点附近最近的真实中心点 for j in range(n): if matrix[i][j] == 0: # 当点空时 temp_distance = abs(x_center - i) + abs(y_center - j) if temp_distance < max_distance: # 替换最大距离 max_distance = temp_distance real_x_center, real_y_center = i, j # 替换真实中心点坐标 distance_sum = 0 for i in range(n): for j in range(n): if matrix[i][j] == 1: # 当点有房屋时 distance_sum += abs(real_x_center - i) + abs(real_y_center - j) # 计算距离总和 return distance_sum n = int(input()) matrix = [list(map(int, input().split())) for i in range(n)] x_sum = 0 y_sum = 0 total_house_count = 0 for i in range(n): for j in range(n): if matrix[i][j] == 1: x_sum += i y_sum += j total_house_count += 1 if total_house_count == n * n: print(-1) else: x_center = x_sum / total_house_count # 利用平均值计算出理想中心点 y_center = y_sum / total_house_count print(cal_distance(matrix, x_center, y_center))