N x N 정사각형 그리드가 있다고 가정하고 각 셀은 비어 있거나(0) 차단되어 있습니다(1). 왼쪽 상단에서 오른쪽 하단까지의 명확한 경로는 -
와 같은 셀 C_1, C_2, ..., C_k로 구성된 경우에만 길이가 k입니다.-
인접한 셀 C_i 및 C_{i+1}는 8방향으로 연결됩니다(따라서 서로 다르고 모서리 또는 모서리를 공유함)
-
C_1은(0, 0) 위치에 있습니다.
-
C_k는 (N-1, N-1) 위치에 있습니다.
-
C_i가 (r, c)에 있으면 grid[r, c]는 비어 있거나 0을 포함합니다.
왼쪽 상단에서 오른쪽 하단까지 가장 짧은 경로의 길이를 찾아야 합니다. 해당 경로가 없으면 -1을 반환합니다.
예를 들어 그리드가 다음과 같은 경우 -
0 | 0 | 0 |
1 | 1 | 0 |
1 | 1 | 0 |
주황색 셀이 경로가 됩니다. 길이는 4입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
방향 배열을 정의하면 8쌍을 유지하여 8개의 다른 방향을 이동합니다. 따라서 이 배열은 [[1,1], [1,-1], [-1,1], [1,0], [0,1], [-1,-1], [0,- 1], [-1,0]]
-
기본 섹션은 그리드를 입력으로 사용하며 아래와 같이 작동합니다. -
-
포인트 큐 정의, q, n:=행 수
-
grid[0, 0]이 0이면 새로운 점 p(0, 0, 1)를 만들고 p를 q에 삽입하고 grid[0, 0] :=1
을 만듭니다. -
q가 비어 있지 않은 동안
-
curr :=q에서 앞점, q에서 앞점 삭제
-
x :=curr의 x 값, y :=curr의 y 값, c :=curr의 c 값
-
x =n – 1이고 y =n – 1이면 c
를 반환합니다. -
c를 1 증가
-
0에서 7 사이의 i에 대해
-
X :=x + d[i, 0], Y :=y + d[i, 1]
-
범위 0과 n의 X와 범위 0과 n의 y, 그리고 grid[X, Y]가 0이면
-
그리드[X, Y] :=1
-
새로운 점 p(X, Y, c)를 q에 삽입
-
-
-
-
반환 -1
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; int d[8][2] = {{1, 1}, {1, -1}, {-1, 1}, {1, 0}, {0, 1}, {-1, -1}, {0, -1}, {-1, 0}}; struct point{ int x, y, c; point(int a, int b, int z){ x = a; y = b; c = z; } }; class Solution { public: int shortestPathBinaryMatrix(vector<vector<int>>& grid) { queue <point> q; int n = grid.size(); if(!grid[0][0]){ q.push(point(0, 0, 1)); grid[0][0] = 1; } while(!q.empty()){ point curr = q.front(); q.pop(); int x = curr.x; int y = curr.y; int c = curr.c; if(x == n-1 && y == n-1)return c; c++; for(int i = 0; i < 8; i++){ int X = x + d[i][0]; int Y = y + d[i][1]; if(X >= 0 && X < n && Y >= 0 && Y < n && !grid[X][Y]){ grid[X][Y] = 1; q.push(point(X, Y, c)); } } } return -1; } }; main(){ vector<vector<int>> v = {{0,0,0},{1,1,0},{1,1,0}}; Solution ob; cout << (ob.shortestPathBinaryMatrix(v)); }
입력
[[0,0,0],[1,1,0],[1,1,0]]
출력
4