智能行李架:快速找到最佳行李位
根据问题描述,我将帮助小明找到最佳行李摆放位置。算法思路如下:
-
读取输入:包括行李架位置数量 (n),左列和右列的行李占用情况(各 (n) 个整数,0 表示空位,1 表示占用),以及小明的位置 ((p, q))((p) 为列,0 或 1;(q) 为位置编号,1 到 (n))。
-
寻找最佳位置:
- 遍历所有位置(左列和右列,每个位置编号 1 到 (n))。
- 对于每个位置,检查是否为空(占用状态为 0)。
- 如果为空,计算该位置到小明位置的距离 (d = |r - q|),其中 (r) 是位置编号。
- 维护最小距离和对应的最佳列:
- 如果当前距离小于已知最小距离,更新最小距离和最佳列。
- 如果当前距离等于已知最小距离,且该位置与小明同列(即列相同),则更新最佳列为当前列(优先同列)。
- 遍历结束后,如果找到空位,输出最佳列的列号(0 或 1)和最小距离;如果没有空位,输出 -1。
-
距离计算:距离定义为位置编号的绝对差,即 ∣r−q∣|r - q|∣r−q∣,其中 rrr 和 qqq 是位置编号(1 到 nnn)。列不影响距离,只用于优先选择。
以下是实现该算法的 Python 代码。代码读取标准输入,处理数据,并输出结果。
def main():import sysdata = sys.stdin.read().splitlines()if not data:print(-1)returnn = int(data[0].strip())left = list(map(int, data[1].split()))right = list(map(int, data[2].split()))p, q = map(int, data[3].split())min_dist = float('inf')best_col = Nonefor c in [0, 1]:for r in range(1, n + 1):if c == 0:occupied = left[r - 1]else:occupied = right[r - 1]if occupied == 0:dist = abs(r - q)if dist < min_dist:min_dist = distbest_col = celif dist == min_dist:if c == p:best_col = cif min_dist == float('inf'):print(-1)else:print(f"{best_col} {min_dist}")if __name__ == "__main__":main()
代码说明:
- 输入处理:读取所有输入行,解析行李架大小 (n)、左列占用列表
left、右列占用列表right,以及小明位置 ((p, q))。 - 遍历位置:对于每个列(0 和 1)和每个位置编号(1 到 (n)),检查是否为空位。
- 距离计算:对于空位,计算距离 d=∣r−q∣d = |r - q|d=∣r−q∣。
- 更新最佳位置:
- 如果当前距离小于最小距离,更新最小距离和最佳列。
- 如果当前距离等于最小距离且与小明同列,则更新最佳列(确保同列优先)。
- 输出:如果找到空位,输出最佳列的列号和最小距离;否则输出 -1。
此代码满足问题要求,包括距离计算、同列优先规则,以及无空位时的处理。您可以将输入数据通过标准输入运行此代码以获取结果。
