h x w 차원의 그리드가 있다고 가정합니다. 그리드는 'initGrid'라는 2D 배열로 표시되며, 그리드의 각 셀은 '#' 또는 '.'로 표시됩니다. '#'은 그리드에 장애물이 있음을 의미하고 '.' 해당 셀을 통과하는 경로가 있음을 의미합니다. 이제 로봇은 행 번호 x와 열 번호 y를 갖는 그리드의 'c' 셀에 배치됩니다. 로봇은 행 번호가 p이고 열 번호가 q인 다른 셀 'd'로 이동해야 합니다. 셀 좌표 c와 d는 모두 정수 쌍으로 표시됩니다. 이제 로봇은 다음과 같은 방식으로 한 셀에서 다른 셀로 이동할 수 있습니다. -
-
로봇은 이동하려는 셀이 현재 있는 셀에 수직 또는 수평으로 인접해 있는 경우 한 셀에서 다른 셀로 걸어갈 수 있습니다.
-
로봇은 현재 위치한 셀을 중심으로 5×5 영역의 모든 셀로 점프할 수 있습니다.
-
로봇은 대상 셀에 장애물이 없는 경우에만 그리드의 다른 셀로 이동할 수 있습니다. 로봇도 그리드를 떠날 수 없습니다.
목적지에 도달하는 데 필요한 점프 수를 알아내야 합니다.
따라서 입력이 h =4, w =4, c ={2, 1}, d ={4, 4}, initGrid ={"#...", ".##.", ". ..#", "..#."}이면 출력은 1이 됩니다. 로봇은 목적지에 도달하기 위해 한 번만 점프하면 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
N:=100정수 쌍 s 및 t를 정의합니다. 크기의 배열 격자를 정의합니다. N. 크기가 N x N인 배열 dst를 정의합니다. 정수 값 a, b 및 e를 포함하는 구조체 노드를 정의합니다. a를 정의합니다. function check(), 이것은 a, b를 취하고 a>=0 AND a=0 AND b dst[a 값 nd, b 값 nd], then:다음 부분을 무시하고 diffx 초기화에 대한 다음 반복으로 건너뜁니다. =-2, diffx <=2일 때 업데이트(diffx를 1만큼 증가 ), 수행:diffy 초기화 :=-2, diffy <=2일 때 업데이트(diffy를 1만큼 증가), 수행:tm :=|diffx + |diffy|| nx :=a 값 nd + diffx, ny =b 값 nd + diffy if check(nx, ny) 및 grid[nx, ny]가 '.'와 같으면 w :=(tm> 1인 경우, 다음 1, 그렇지 않으면 0) dst[nd의 a 값, nd의 b 값] + w 예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include네임스페이스 std;const int INF =1e9;#define N 100int h, w;pair s, t;string grid[N];int dst[N ][N];struct node { int a, b, e;};bool check(int a, int b) { return a>=0 &&a =0 &&b doubleq; doubleq.push_back({a, b, dst[a][b]}); 동안 (!doubleq.empty()) { 노드 nd =doubleq.front(); doubleq.pop_front(); (nd.e> dst[nd.a][nd.b]) 계속하면; for (int diffx =-2; diffx <=2; diffx++) { for (int diffy =-2; diffy <=2; diffy++) { int tm =abs(diffx) + abs(diffy); int nx =nd.a + diffx, ny =nd.b + diffy; if (check(nx, ny) &&grid[nx][ny] =='.') { int w =(tm> 1) ? 1:0; if (dst[nd.a][nd.b] + w c, pair d, string initGrid[]){ s =c; t =d; s.first--, s.second--, t.first--, t.second--; for(int i =0; i c ={2, 1}, d ={4, 4}; string initGrid[] ={"#...", ".##.", "...#", "..#."}; 해결(c, d, initGrid); 반환 0;} 입력
4, 4, {2, 1}, {4, 4}, {"#...", ".##.", "...#", "..#."}사전>출력
1