飞机停放问题:优化时间表和停放位置(回溯)

问题描述 投票:0回答:0

我正在尝试解决飞机时刻表问题,我收到一份飞机清单,我必须以这样一种方式停放飞机,即停放时不会干扰其他飞机的起飞。到目前为止,我在 Python 中有这个解决方案替代方案,但是我在回溯的实现方面遇到了问题,因为该程序应该给我打印一个字典,其中包含飞机应该停放的位置,但它打印的是一个空字典。示例输入 6 4 5 01 .. == .. 02 03 04 .. 05 06 07 08 .. ## 09 10 11 .. .. 12 +1 +2 +3 +4 +5 +6 -6 -5 - 4 -3 -2 -1 示例输出案例 1:是 12 09 05 06 02 10


def movimientoValido(matriz, filas, columnas, parqueaderosAsignados):
  if matriz[filas][columnas] == "##":
    return False
  if not matriz[filas][columnas].isdigit():
    return False
  if matriz[filas][columnas] in parqueaderosAsignados.values():
    return False
  return True


def backtrack(matriz, listaEventos, indiceAvion, parqueaderosAsignados):
  if indiceAvion == len(listaEventos):
    return True

  actual = listaEventos[indiceAvion]

  if actual > 0:  # Aterrizando
    for filas in range(len(matriz)):
      for columnas in range(len(matriz[0])):
        if movimientoValido(matriz, filas, columnas, parqueaderosAsignados, indiceAvion):
          parqueaderosAsignados[indiceAvion] = matriz[filas][columnas]
          if backtrack(matriz, listaEventos, indiceAvion + 1, parqueaderosAsignados):
            return True
          parqueaderosAsignados[indiceAvion] = ""
  return False


def recibirMatriz():
  parqueaderosAsignados = {}
  numeroAviones, filas, columnas = map(int, input().split())
  if numeroAviones == 0:
    return False

  matriz = []
  for _ in range(filas):
    matriz.append(input().split())

  listaEventos = list(map(int, input().split()))

  for i in range(numeroAviones):
    parqueaderosAsignados[i] = ""

  backtrack(matriz, listaEventos, 0, parqueaderosAsignados)

  # Imprimir el resultado de la asignación de parqueaderos
  print(parqueaderosAsignados.values())

def main():
  while True:
    if not recibirMatriz():
      break


if __name__ == '__main__':
  main()

示例输出案例 1:是 12 09 05 06 02 10 但这是我的实际输出:dict_values(['', '', '', '', '', ''])

python backtracking
© www.soinside.com 2019 - 2024. All rights reserved.