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

Python에서 모든 사람을 만나기 위해 커버해야 하는 최소 거리를 찾는 프로그램

<시간/>

아래와 같은 값이 거의 없는 2D 행렬이 있다고 가정합니다. -

  • 0은 빈 셀을 나타냅니다.

  • 1은 벽을 나타냅니다.

  • 2는 사람을 나타냅니다.

여기에서 사람은 이 네 가지 방향(위, 아래, 왼쪽, 오른쪽) 중 하나를 걸을 수 있습니다. 우리는 각 사람이 걸어야 하는 총 이동 거리를 최소화하고 최종적으로 거리를 찾을 수 있도록 벽이 아닌 셀을 찾아야 합니다.

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

2 0 1 0
1 0 1 2
0 0 2 2

가장 좋은 만남 지점이 오른쪽 하단 모서리이므로 출력은 7이 됩니다.

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

  • twos :=새 지도, 비용 :=새 지도

  • 행렬의 각 인덱스 i와 행 r에 대해 수행

    • r의 각 인덱스 j와 값 v에 대해 수행

      • v가 2와 같으면

        • 2s[i, j] :=[i, j, 0]

        • Cost[i, j] :=주어진 행렬과 같은 크기의 2D 행렬을 만들고 무한대로 채웁니다.

  • 각 키 값 쌍(k, q)에 대해 2개로

    • 본 :=새로운 세트

    • q가 비어 있지 않은 동안 수행

      • (i, j, 비용) :=q에서 첫 번째 요소 삭제

      • (i, j)가 표시되면

        • 다음 반복으로 이동

      • 추가(i, j) 본

      • 비용[k, i, j] :=비용

      • ((1, 0), (−1, 0), (0, 1), (0, −1))의 각 (di, dj)에 대해 수행

        • (ni, nj) :=(i + di, j + dj)

        • ni와 nj가 행렬의 범위에 있고 matrix[ni, nj]가 1이 아닌 경우

          • q의 끝에 (ni, nj, 비용 + 1) 삽입

  • ans :=무한대

  • 행렬의 행 수까지 범위 0에 있는 i에 대해

    • 행렬의 열 개수까지 범위 0의 j에 대해

      • cur_cost :=0

      • 모든 비용 값 목록의 각 arr에 대해 다음을 수행하십시오.

        • cur_cost :=cur_cost + arr[i, j]

      • ans :=ans 및 cur_cost의 최소값

  • 반환

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

class 솔루션:def solve(self, matrix):twos ={} 비용 ={} for i, r in enumerate(matrix):for j, v in enumerate(r):if v ==2:twos[ (i, j)] =[(i, j, 0)] 비용[(i, j)] =[[1e9 for _ in matrix[0]] for _in matrix] for k, q in twos.items() :본 =set() while q:i, j, 비용 =q.pop(0) if (i, j) in see:계속 see.add((i, j)) 비용[k][i][j ] =((1, 0), (-1, 0), (0, 1), (0, -1))에서 di, dj에 대한 비용:ni, nj =i + di, j + dj if (ni>=0 및 nj>=0 및 ni  

입력

행렬 =[[2, 0, 1, 0],[1, 0, 1, 2],[0, 0, 2, 2]]

출력

7