Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Bankin Python에서 경비원과의 최단 거리 찾기


'O'는 열린 공간, 'G'는 경비원, 'W'는 은행의 벽을 나타내며, 한 경비원으로부터의 최단 거리와 관련하여 매트릭스의 모든 O를 교체해야 합니다. 어떤 벽도 통과할 수 없습니다. 출력 매트릭스에서 가드는 0으로 대체되고 벽은 -1로 대체됩니다.

따라서 입력이 다음과 같으면

O O O O G
O O O W O
O W O O O
G W W W O
O O O O G

그러면 출력은

3 3 2 1 0
2 3 3 -1 1
1 -1 4 3 2
0 -1 -1 -1 1
1 2 2 1 0

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • 남 :=5

  • N :=5

  • 디렉토리 행 :=[-1, 0, 1, 0]

  • dir_col :=[0, 1, 0, -1]

  • is_ok() 함수를 정의합니다. 이것은 i, j가 걸릴 것입니다

  • (i 범위 0 및 M) 또는 (j 범위 0 및 j N)인 경우

    • 거짓을 반환

  • 참을 반환

  • isSafe() 함수를 정의합니다. 이것은 i, j, 행렬, 결과를 취합니다.

  • 행렬[i, j]가 'O'가 아니거나 결과[i, j]가 -1이 아니면

    • 거짓을 반환

  • 참을 반환

  • compute_dist() 함수를 정의합니다. 이것은 행렬을 취합니다.

  • result :=M x N 차수의 행렬을 만들고 -1로 채움

  • 이중 종료 대기열 정의 q

  • 범위 0에서 M에 있는 i에 대해 수행

    • 0에서 N 사이의 j에 대해 수행

      • 결과[i, j] :=-1

      • 행렬[i, j]이 'G'와 같으면

        • 위치 :=[i, j, 0]

        • q 왼쪽에 pos 삽입

        • 결과[i, j] :=0

  • q> 0의 크기가 0이 아닌 동안 수행

    • curr :=q에서 마지막 요소 삭제

    • x, y, dist :=curr[0], curr[1], curr[2]

    • 범위 0에서 3까지의 i에 대해 수행

      • is_ok(x + dir_row[i], y + dir_col[i])가 0이 아니고 isSafe(x + dir_row[i], y + dir_col[i], matrix, result)가 0이 아니면

        • 결과[x + dir_row[i], y + dir_col[i]] :=dist + 1

        • 위치 :=[x + dir_row[i], y + dir_col[i], dist + 1]

        • q 왼쪽에 pos 삽입

  • 범위 0에서 M에 있는 i에 대해 수행

    • 0에서 N 사이의 j에 대해 수행

      • 결과 표시[i,j]

    • 다음 줄로 이동

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

from collections import deque as queue
M = 5
N = 5
dir_row = [-1, 0, 1, 0]
dir_col = [0, 1, 0, -1]
def is_ok(i, j):
   if ((i < 0 or i > M - 1) or (j < 0 or j > N - 1)):
      return False
   return True
def isSafe(i, j,matrix, result):
   if (matrix[i][j] != 'O' or result[i][j] != -1):
      return False
   return True
def calculate_dist(matrix):
   result = [[ -1 for i in range(N)]for i in range(M)]
   q = queue()
   for i in range(M):
      for j in range(N):
         result[i][j] = -1
         if (matrix[i][j] == 'G'):
            pos = [i, j, 0]
            q.appendleft(pos)
            result[i][j] = 0
   while (len(q) > 0):
      curr = q.pop()
      x, y, dist = curr[0], curr[1], curr[2]
   for i in range(4):
      if is_ok(x + dir_row[i], y + dir_col[i]) and isSafe(x + dir_row[i], y + dir_col[i], matrix, result) : result[x + dir_row[i]][y + dir_col[i]] = dist + 1
      pos = [x + dir_row[i], y + dir_col[i], dist + 1]
      q.appendleft(pos)
   for i in range(M):
      for j in range(N):
         if result[i][j] > 0:
            print(result[i][j], end=" ")
         else:
            print(result[i][j],end=" ")
      print()

matrix = [['O', 'O', 'O', 'O', 'G'],
   ['O', 'O', 'O', 'W', 'O'],
   ['O', 'W', 'O', 'O', 'O'],
   ['G', 'W', 'W', 'W', 'O'],
   ['O', 'O', 'O', 'O', 'G']]

calculate_dist(matrix)

입력

[['O', 'O', 'O', 'O', 'G'],
['O', 'O', 'O', 'W', 'O'],
['O', 'W', 'O', 'O', 'O'],
['G', 'W', 'W', 'W', 'O'],
['O', 'O', 'O', 'O', 'G']]

출력

3 3 2 1 0
2 3 3 -1 1
1 -1 4 3 2
0 -1 -1 -1 1
1 2 2 1 0