Сравнение списков в симуляции марсохода

#python #list

#python #Список

Вопрос:

Я пишу программу, которая имитирует базовый марсоход. Матрица — это «марс», где первые два числа — это координаты x и y, а третье — показатель безопасности, который определяет, является ли данная координата судоходной (0-плохо 4-хорошо). «Ровер» может перемещаться только прямо вправо или вниз (начало -0,0 и конец -3,3). Моя программа может определить, какие координаты безопасны, но я изо всех сил пытаюсь найти способ сравнить их, чтобы найти безопасный путь. Мне нужно найти способ сравнить отображаемые выходные данные, чтобы координата x или y изменялась только на единицу (вправо или вниз) для определения пути.

 # This is mars
matrix = [[0, 0, 1], [0, 1, 4], [0, 2, 1], [0, 3, 0],
          [1, 0, 1], [1, 1, 1], [1, 2, 0], [1, 3, 1],
          [2, 0, 0], [2, 1, 1], [2, 2, 1], [2, 3, 2],
          [3, 0, 0], [3, 1, 0], [3, 2, 1], [3, 3, 1]]

# This decides if a given coordinate is safe
def is_safe(sublist):
    if sublist[2::3] == [0]:
        return False
    else:
        return True

# As of now this just stores safe coordinates in a list
def find_paths():
    for sublist in matrix:
        if is_safe(sublist):
            safepath.append(sublist)

safepath = []
find_paths()
print(safepath)
 

Вывод:

 [[0, 0, 1], [0, 1, 4], [0, 2, 1], [1, 0, 1], [1, 1, 1], [1, 3, 1], [2, 1, 1],
 [2, 2, 1], [2, 3, 2], [3, 2, 1], [3, 3, 1]]
 

Комментарии:

1. sublist[2::3] должно быть sublist[2:3] . Но это всего лишь один элемент, так почему бы и нет if sublist[2] == 0: ?

2. Совет: if something: return True; else: return False может быть просто return something . И если вы измените два возврата, это может быть return not something

3. Ваша структура данных не кажется очень полезной для поиска путей. Было бы лучше, если бы у вас была 2-мерная структура, где индексы — это координаты, а не список координат.

4. Затем вы можете найти соседние местоположения, просто добавляя и вычитая из индексов.

5. Используйте рекурсивный алгоритм. Базовый вариант таков [3,3] : когда вы доберетесь туда, вы закончите. Найдите координату справа. Если это безопасно, выполните рекурсию из него. Найдите координату вниз. Если это безопасно, выполните рекурсию из него.

Ответ №1:

В качестве примера по комментариям Бамара:

 m = {}
for x,y,z in matrix:
  entry = m.get(x, {})
  entry[y] = z
  m[x] = entry

m[0][0] # outputs 1; i.e. m now contains matrix in normalized form
 

Теперь ваша проблема заключается в перемещении в традиционной 2D-матрице, а не в странном разборе списка.