<Baekjoon> #16948 BFS_Death Knight c++
(r1, c1)에서 (r2, c2)로 이동하는 최소 이동 횟수를 구하는 문제이므로 BFS를 이용해 풀어야 한다는 것을 알 수 있다.
(대개 BFS는 그래프에서의 최단 경로 문제를 푸는데 용도로 사용된다)
- BFS 복습
queue <pair<int, int>> q
queue
에는r,c
좌표 한 쌍이 들어가야 하므로pair
로 선언해주고 처음에는 현재 위치r,c
를 넣어준다queue <pair<int, int>> q; q.push(make_pair(r, c));
- r,c 가 움직일 수 있는 방향
int dy[6] = { -2,-2,0,0,2,2 }; int dx[6] = { -1,1,-2,2,-1,1 };
- 현재 위치
cur_y, cur_x
에서 움직일 수 있는 6개 위치를 구해준다for (int i = 0; i < 6; i++) int nx_y = cur_y + dy[i]; int nx_x = cur_x + dx[i];
- 구해진 위치
(nx_y, nx_x)
가 체스 판의 범위를 넘지 않고, 한 번도 발견되지 않았으면 즉,dis[nx_y][nx_x]=-1
이면 현재 거리dist[cur_y][cur_x]
에 1을 더해준다if (nx_y<0 || nx_x<0 || nx_y>n || nx_x>n) continue; if (dist[nx_y][nx_x] == -1) { q.push(make_pair(nx_y, nx_x)); dist[nx_y][nx_x] = dist[cur_y][cur_x] + 1;}
전체 코드
#include <iostream> #include <vector> #include <queue> #include <string.h> using namespace std; const int MAX = 201; int dist[MAX][MAX]; int dy[6] = { -2,-2,0,0,2,2 }; int dx[6] = { -1,1,-2,2,-1,1 }; int n; void bfs(int r, int c) { dist[r][c] = 0; queue <pair<int, int>> q; q.push(make_pair(r, c)); while (!q.empty()) { int cur_y = q.front().first; int cur_x = q.front().second; q.pop(); for (int i = 0; i < 6; i++) { int nx_y = cur_y + dy[i]; int nx_x = cur_x + dx[i]; if (nx_y<0 || nx_x<0 || nx_y>n || nx_x>n) continue; if (dist[nx_y][nx_x] == -1) { q.push(make_pair(nx_y, nx_x)); dist[nx_y][nx_x] = dist[cur_y][cur_x] + 1; } } } } int main() { memset(dist, -1, sizeof(dist)); cin >> n; int r1, r2, c1, c2; cin >> r1 >> c1 >> r2 >> c2; bfs(r1, c1); cout << dist[r2][c2] << endl; return 0; }
Author And Source
이 문제에 관하여(<Baekjoon> #16948 BFS_Death Knight c++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kimmy/Baekjoon-16948-BFSDeath-Knight-c저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)