Найдите путь, думайте как координатная плоскость

#python #recursion

#питон #рекурсия

Вопрос:

 def path(given_map, x, y):  x = given_map[0][0]   y = given_map[0][0]  cnt = 0   if x == len(given_map) and y == len(given_map):  cnt  = 1  return cnt   else:  if x lt; len(given_map) and y lt; len(given_map):  return path(given_map, x, y)    elif x lt; len(given_map) and y == len(given_map):  return path(given_map, x, y)    elif x == len(given_map) and y lt; len(given_map):  return path(given_map, x, y)  else:  cnt = 0  return cnt   if __name__ == '__main__':  input_map = [[1,2,9,4,9],  [1,5,8,7,9],   [9,3,9,9,2],   [2,3,7,5,9],   [1,9,9,1,0]]  print(path(input_map, 0, 0))   input_map = [[1,1,2],   [1,2,2],   [1,2,0]]  print(path(input_map, 0, 0))  

Список n*n должен быть введен для создания функции, которая возвращает количество путей, которые могут пройти от начальной точки [0][0] до конечной точки [n-1][n-1].

Движение может быть сделано только вниз и вправо, и может быть перемещено только в одном направлении по номеру, указанному в соответствующих координатах x и y.

Он не включает случаи за пределами карты после перемещения.

Приведенный выше код реализован настолько, насколько это возможно в пределах моих возможностей. Как я могу изменить его, чтобы он функционировал нормально?

Ответ №1:

Если вам не требуется реализовать это с помощью рекурсии, я бы предложил подход BFS (Поиск по ширине) с использованием словаря для отслеживания позиций/количества, которых вы достигли на каждом шаге прогрессии:

 def path(M):  result = 0 # final result  bounds = range(len(M)) # inside map  paths = {(0,0):1} # one path at start  while paths: # spread counts  nextPos = dict() # track next positions  for (x,y),count in paths.items(): # extend positon/count  if x == y == len(M)-1: result  = count # capture final count  dist = M[x][y] # travel distance  if not dist: continue # no movement ...  for x2,y2 in [(x,y dist),(x dist,y)]: # travel down amp; right  if x2 in bounds and y2 in bounds: # propagate count  nextPos[x2,y2] = nextPos.get((x2,y2),0) count  paths = nextPos # next step on paths  return result   input_map = [[1,2,9,4,9],  [1,5,8,7,9],   [9,3,9,9,2],   [2,3,7,5,9],   [1,9,9,1,0]] print(path(input_map)) # 2  input_map = [[1,1,2],   [1,2,2],   [1,2,0]] print(path(input_map)) # 1  

Если вам требуется реализовать рекурсивный подход, функцию можно адаптировать следующим образом (возвращая сумму рекурсивных подсчетов путей), но тогда она больше не будет BFS:

 def path(M,x=0,y=0):  if x == y == len(M)-1: return 1 # goal reached  dist = M[x][y] # travel distance  if not dist: return 0 # no movement  bounds = range(len(M)) # inside map  return sum(path(M,x2,y2) for x2,y2 in [(x,y dist),(x dist,y)]  if x2 in bounds and y2 in bounds) # sum of paths