2 차원 배열에서 두 좌표 사이의 최단 경로를 찾는 방법은 무엇입니까?

특집

2D 배열의 한 지점 (배열의 위치를 ​​나타내는 x 및 y 값이있는 좌표)에서 다른 지점으로 이동하는 가장 짧은 방법을 찾으려고합니다.

초기 좌표에서 최종 좌표까지 이동해야하는 좌표 배열을 출력하고 싶습니다.

이와 같은 배열의 한 예는 다음과 같습니다.

arr = [
          [15, 7, 3],
          [1, 2, 6],
          [7, 4, 67]
      ]

이 경우에서 시작 arr[0][0]하고 끝날 것이라고 말할 수 있습니다 arr[2][2]. 따라서 좌표는 (0, 0)(2, 2)입니다.

예상되는 출력은 다음과 같습니다. [(0, 2), (1, 2), (2, 2), (2, 1)]또는 길이가 같은 것입니다.


내가 시도한 것

아래에서 반 성공적인 기능을 만들 수 있었지만 큰 경우에는 매우 비효율적이고 시간이 많이 걸립니다.

import math

arr = [
          [0, 1, 2],
          [3, 4, 5],
          [6, 7, 8]
      ]

coor1 = (0, 0) # seen as 2 in the arr array
coor2 = (2, 2) # seen as 7 in the arr array

def pythagoras(a, b):

    # find pythagorean distances between the two
    distance_y = max(a[0], b[0]) - min(a[0], b[0])
    distance_x = max(a[1], b[1]) - min(a[1], b[1])

    # calculate pythagorean distance to 3 d.p.
    pythag_distance = round(math.sqrt(distance_x**2 + distance_y**2), 3)

    return pythag_distance


def find_shortest_path(arr, position, target):
    ''' finds shortest path between two coordinates, can't go diagonally '''
    coordinates_for_distances = []
    distances = []

    for i in range(len(arr)):
        for r in range(len(arr)):
            coordinates_for_distances.append((i, r))
            distances.append(pythagoras((i, r), target))

    route = []

    while position != target:
        acceptable_y_range = [position[1] + 1, position[1] - 1]
        acceptable_x_range = [position[0] + 1, position[0] - 1]

        possibilities = []
        distance_possibilities = []

        for i in range(len(coordinates_for_distances)):
            if coordinates_for_distances[i][0] == position[0] and coordinates_for_distances[i][1] in acceptable_y_range:
                possibilities.append(coordinates_for_distances[i])
                distance_possibilities.append(distances[i])

            elif coordinates_for_distances[i][1] == position[1] and coordinates_for_distances[i][0] in acceptable_x_range:
                possibilities.append(coordinates_for_distances[i])
                distance_possibilities.append(distances[i])

        zipped_lists = zip(distance_possibilities, possibilities)
        minimum = min(zipped_lists)
        position = minimum[1]
        route.append(position)

    return route
야투

좌표 쌍 사이의 최단 경로를 찾기 위해이를 그래프 문제로 변환 할 수 있습니다. 여기서 각 좌표는 그래프 노드입니다. 이제이 설정에서 두 노드 사이의 최단 경로를 찾는 것은 잘 알려진 그래프 이론 문제 이며 올바른 도구를 사용하여 쉽게 해결할 수 있습니다.

실제로 Graph generator 가있는 NetworkX 를 사용할 수 있으며 , 이는 노드 의 2d 그리드 그래프를 반환하며 , 각 노드는 가장 가까운 이웃에 연결됩니다. 아웃 케이스에 적합합니다.mxn

import networkx as nx
from matplotlib import pyplot as plt

G = nx.grid_2d_graph(3,3)

plt.figure(figsize=(6,6))
pos = {(x,y):(y,-x) for x,y in G.nodes()}
nx.draw(G, pos=pos, 
        node_color='lightgreen', 
        with_labels=True,
        node_size=600)

                  여기에 이미지 설명 입력

이제 networkX를 사용 nx.bidirectional_shortest_path하여 두 좌표 사이의 최단 경로를 찾을 수 있습니다 .

coor1 = (0, 2) # seen as 2 in the arr array
coor2 = (2, 1) # seen as 7 in the arr array

nx.bidirectional_shortest_path(G, source=coor1, target=coor2)
# [(0, 2), (1, 2), (2, 2), (2, 1)]

참고 nx.grid_2d_graph임의의 큰까지 그리드 그래프를 생성 m하고 n레이블을 배치하여, 당신은 또한 마찬가지로 위의 좌표 격자를 플롯 할 수 있습니다 :

                    여기에 이미지 설명 입력

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

레이블의 2 차원 배열을 레이블에서 좌표로 맵으로 변환하는 효율적인 방법은 무엇입니까?

분류에서Dev

GMSMapView를 사용하여 두 위치 사이의 최단 경로를 찾고 iOS에서 지그재그 경로를 그리는 방법은 무엇입니까?

분류에서Dev

underscore.js에서 2 차원 배열의 요소를 찾는 방법은 무엇입니까?

분류에서Dev

그리드에서 서로 다른 두 지점 사이의 최단 경로를 찾는 방법은 무엇입니까?

분류에서Dev

Swift 3의 다른 배열에서 두 개의 정수를 찾아 일치시키는 가장 좋은 방법은 무엇입니까? (다차원 배열)

분류에서Dev

2 차원 배열에서 행과 열의 길이를 얻는 방법은 무엇입니까?

분류에서Dev

Java에서 두 개의 n 차원 배열의 합계를 얻는 방법은 무엇입니까?

분류에서Dev

몇 가지 제약 조건이 주어지면 배열에서 두 요소의 최대 차이를 찾는 방법은 무엇입니까?

분류에서Dev

배열에서 삼중 합의 최소 차이를 효율적으로 찾는 방법은 무엇입니까?

분류에서Dev

Excel 시트에서 한 열의 두 행 사이의 시간 차이를 찾는 방법은 무엇입니까?

분류에서Dev

2 차원에서 두 개의 3D 배열을 효율적으로 병합하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 두 개의 변수 배열에서 2 차원 배열을 만드는 방법은 무엇입니까?

분류에서Dev

Numpy에서 2 차원 배열의 모든 요소를 1 차원 배열로 효율적으로 곱하는 방법은 무엇입니까?

분류에서Dev

PHP에서 내림차순 배열로 두 차원 배열을 정렬하는 방법은 무엇입니까?

분류에서Dev

2D 배열에서 두 셀 사이의 직접 경로가 주어진 셀에 의해 차단되는지 확인하는 방법은 무엇입니까?

분류에서Dev

neo4j에서 두 노드 간의 최단 관계를 찾는 방법은 무엇입니까?

분류에서Dev

Python 3에서 2 차원 numpy 배열에서 두 개의 하위 배열을 바꾸는 방법은 무엇입니까?

분류에서Dev

균일 한 간격의 배열에 대한 위치 좌표 (n × 2)를 얻는 방법은 무엇입니까?

분류에서Dev

Java에서 계층 구조 테이블로 2 차원 배열을 표시하는 방법은 무엇입니까?

분류에서Dev

PHP : 값이 다른 두 개의 다차원 배열의 키를 나열하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 배열의 다차원 배열을 여러 단일 배열로 분할하는 방법은 무엇입니까?

분류에서Dev

키가 다르지만 PHP에서 동일한 값을 가진 두 개의 다차원 배열의 차이를 얻는 방법은 무엇입니까?

분류에서Dev

numpy.linalg.solve 주어진 포인트 좌표를 사용하여 두 선이 교차하는 위치를 찾는 방법은 무엇입니까?

분류에서Dev

내장`슬라이스`를 사용하여 2 차원 배열의 2 차원 블록에 액세스하는 방법은 무엇입니까?

분류에서Dev

두 좌표를 서로 일치시키는 방법은 무엇입니까?

분류에서Dev

원점에서 각도 \ theta를 갖는 시야 절두체의 8 좌표 값은 무엇입니까?

분류에서Dev

2 차원 배열 목록에 데이터를 저장하고 이중 반복기를 사용하여 표시하는 방법은 무엇입니까?

분류에서Dev

파이썬의 2D 목록에서 최대 x 및 최소 y 좌표를 얻는 방법은 무엇입니까?

분류에서Dev

Mysql에서 두 열의 가장 작은 차이를 찾는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    레이블의 2 차원 배열을 레이블에서 좌표로 맵으로 변환하는 효율적인 방법은 무엇입니까?

  2. 2

    GMSMapView를 사용하여 두 위치 사이의 최단 경로를 찾고 iOS에서 지그재그 경로를 그리는 방법은 무엇입니까?

  3. 3

    underscore.js에서 2 차원 배열의 요소를 찾는 방법은 무엇입니까?

  4. 4

    그리드에서 서로 다른 두 지점 사이의 최단 경로를 찾는 방법은 무엇입니까?

  5. 5

    Swift 3의 다른 배열에서 두 개의 정수를 찾아 일치시키는 가장 좋은 방법은 무엇입니까? (다차원 배열)

  6. 6

    2 차원 배열에서 행과 열의 길이를 얻는 방법은 무엇입니까?

  7. 7

    Java에서 두 개의 n 차원 배열의 합계를 얻는 방법은 무엇입니까?

  8. 8

    몇 가지 제약 조건이 주어지면 배열에서 두 요소의 최대 차이를 찾는 방법은 무엇입니까?

  9. 9

    배열에서 삼중 합의 최소 차이를 효율적으로 찾는 방법은 무엇입니까?

  10. 10

    Excel 시트에서 한 열의 두 행 사이의 시간 차이를 찾는 방법은 무엇입니까?

  11. 11

    2 차원에서 두 개의 3D 배열을 효율적으로 병합하는 방법은 무엇입니까?

  12. 12

    파이썬에서 두 개의 변수 배열에서 2 차원 배열을 만드는 방법은 무엇입니까?

  13. 13

    Numpy에서 2 차원 배열의 모든 요소를 1 차원 배열로 효율적으로 곱하는 방법은 무엇입니까?

  14. 14

    PHP에서 내림차순 배열로 두 차원 배열을 정렬하는 방법은 무엇입니까?

  15. 15

    2D 배열에서 두 셀 사이의 직접 경로가 주어진 셀에 의해 차단되는지 확인하는 방법은 무엇입니까?

  16. 16

    neo4j에서 두 노드 간의 최단 관계를 찾는 방법은 무엇입니까?

  17. 17

    Python 3에서 2 차원 numpy 배열에서 두 개의 하위 배열을 바꾸는 방법은 무엇입니까?

  18. 18

    균일 한 간격의 배열에 대한 위치 좌표 (n × 2)를 얻는 방법은 무엇입니까?

  19. 19

    Java에서 계층 구조 테이블로 2 차원 배열을 표시하는 방법은 무엇입니까?

  20. 20

    PHP : 값이 다른 두 개의 다차원 배열의 키를 나열하는 방법은 무엇입니까?

  21. 21

    파이썬에서 배열의 다차원 배열을 여러 단일 배열로 분할하는 방법은 무엇입니까?

  22. 22

    키가 다르지만 PHP에서 동일한 값을 가진 두 개의 다차원 배열의 차이를 얻는 방법은 무엇입니까?

  23. 23

    numpy.linalg.solve 주어진 포인트 좌표를 사용하여 두 선이 교차하는 위치를 찾는 방법은 무엇입니까?

  24. 24

    내장`슬라이스`를 사용하여 2 차원 배열의 2 차원 블록에 액세스하는 방법은 무엇입니까?

  25. 25

    두 좌표를 서로 일치시키는 방법은 무엇입니까?

  26. 26

    원점에서 각도 \ theta를 갖는 시야 절두체의 8 좌표 값은 무엇입니까?

  27. 27

    2 차원 배열 목록에 데이터를 저장하고 이중 반복기를 사용하여 표시하는 방법은 무엇입니까?

  28. 28

    파이썬의 2D 목록에서 최대 x 및 최소 y 좌표를 얻는 방법은 무엇입니까?

  29. 29

    Mysql에서 두 열의 가장 작은 차이를 찾는 방법은 무엇입니까?

뜨겁다태그

보관