Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 벽과 문

<시간/>

하나의 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 , ],]