하나의 m x n 2D 그리드가 있고 이 세 가지 가능한 값으로 초기화된다고 가정합니다.
-
-1 벽이나 장애물.
-
게이트의 경우 0입니다.
-
INF 무한대는 빈 방을 의미합니다.
여기서 2^31 - 1 =2147483647은 게이트까지의 거리가 2147483647보다 작다고 가정할 수 있으므로 INF입니다. 각 빈 방을 가장 가까운 게이트까지의 거리로 채웁니다. 게이트에 도달할 수 없는 경우 INF로 채워야 합니다.
따라서 입력이 다음과 같으면
INF | -1 | 0 | INF |
INF | INF | INF | -1 |
INF | -1 | INF | -1 |
0 | -1 | INF | INF |
그러면 출력은
3 | -1 | 0 | 1 |
2 | 2 | 1 | -1 |
1 | -1 | 2 | -1 |
0 | -1 | 3 | 4 |
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
크기의 배열 디렉토리 정의:4 x 2 :={{1, 0}, {-1, 0}, {0, 1}, {0,-1}}
-
n :=방 크기
-
m :=(n이 0이 아니면 열 개수, 그렇지 않으면 0)
-
쌍의 하나의 대기열 q 정의
-
initialize i :=0의 경우, i
-
j 초기화의 경우:=0, j
-
방[i, j]이 0과 같으면 -
-
q에 { i, j } 삽입
-
-
-
-
initialize lvl :=1의 경우 q가 비어 있지 않으면 업데이트(lvl을 1씩 증가)하고 -
를 수행합니다.-
sz :=q의 크기
-
sz가 0이 아닌 동안 각 반복에서 sz를 1씩 줄입니다. -
-
한 쌍의 curr 정의:=q의 첫 번째 요소
-
q에서 요소 삭제
-
x :=curr.first
-
y :=curr.second
-
initialize i :=0의 경우, i <4일 때 업데이트(i를 1만큼 증가), 수행 -
-
nx :=x + dir[i, 0]
-
ny :=y + dir[i, 1]
-
nx <0 또는 ny <0 또는 nx>=n 또는 ny>=m 또는 rooms[nx, ny]
-
다음 부분은 무시하고 다음 반복으로 건너뜁니다.
-
-
방[nx, ny] :=lvl
-
q에 { nx, ny } 삽입
-
-
-
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include네임스페이스 std;void print_vector(vector v){ cout <<"["; for(int i =0; i &rooms) { int n =rooms.size(); 정수 m =n ? 방[0].크기() :0; 큐<쌍 > q; for (int i =0; i curr =q.front(); q.팝(); int x =curr.first; 정수 y =curr.second; for (int i =0; i <4; i++) { int nx =x + dir[i][0]; 정수 ny =y + dir[i][1]; if (nx <0 || ny <0 || nx>=n || ny>=m || 방[nx][ny] v ={{2147483647,-1,0,2147483647}, {2147483647,2147483647,2147483647,-1}, {26474,-1}, {261474 -1}, {0,-1,2147483647,2147483647}}; 솔루션 ob; ob.wallsAndGates(v); print_vector(v);}
입력
{{2147483647,-1,0,2147483647},{2147483647,2147483647,2147483647,-1},4147483647,-1,2147483647, /사전>출력
[[3, -1, 0, 1, ],[2, 2, 1, -1, ],[1, -1, 2, -1, ],[0, -1, 3, 4 , ],]