도시 블록을 나타내는 고유 문자열 행렬과 방문할 블록을 포함하는 문자열의 또 다른 목록이 있다고 가정합니다. 블록 행렬[0][0]에 있는 경우 모든 블록을 순서대로 방문하는 데 필요한 총 맨해튼 거리를 찾으십시오.
따라서 입력이 다음과 같으면
Q | 나 | C |
디 | 이 | Z |
지 | 지 | 나 |
블록 =[H,B,C]
그러면 "h"는 2블록 아래쪽(남쪽)과 1블록 오른쪽(동쪽), "b"는 2블록 위쪽(북쪽), "c"는 1블록 오른쪽(동쪽)이므로 출력은 6이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- coords :='start' 키와 값(0, 0)이 있는 지도
- 매트의 각 행에 대해 다음을 수행합니다.
- 매트의 각 열에 대해 다음을 수행합니다.
- (행, 열)을 좌표[mat[row, col]]에 삽입
- 매트의 각 열에 대해 다음을 수행합니다.
- 거리:=0
- 시작 부분에 '시작'을 추가하여 블록 업데이트
- 0에서 블록 크기 -1 사이의 i에 대해
- c1 :=좌표[블록[i]]
- c2 :=좌표[블록[i+1]]
- d :=|c1[0]-c2[0]| + |c1[1]-c2[1]|
- dist :=dist + d
- 반환 거리
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
class Solution: def solve(self, mat, blocks): coords = {'start': (0,0)} for row in range(len(mat)): for col in range(len(mat[row])): coords[mat[row][col]] = (row,col) dist = 0 blocks = ['start']+blocks for i in range(len(blocks)-1): c1 = coords[blocks[i]] c2 = coords[blocks[i+1]] d = abs(c1[0]-c2[0]) + abs(c1[1]-c2[1]) dist += d return dist ob = Solution() inp = [["q", "b", "c"], ["d", "e", "z"], ["g", "h", "i"]] blk = ["h", "b", "c"] print(ob.solve(inp, blk))
입력
[["q", "b", "c"],["d", "e", "z"],["g", "h", "i"]]
출력
6