※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 6798번 문제인 Knight Hop이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/6798
체스판 위에서 나이트와 같은 말의 움직임으로 주어진 두 칸 사이를 이동하기 위한 최소 움직임의 횟수를 구하는 문제이다.
각 칸을 노드로, 각 칸에서 움직일 수 있는 다음 (최대) 8가지 움직임을 에지로 하는 그래프로 문제 상황을 모델링하면 주어진 문제는 두 칸을 나타내는 노드 사이의 최단거리와 같음을 알 수 있다. 이 때 모든 에지의 가중치는 같으므로 이 문제는 BFS 등의 알고리즘을 이용해 간단하게 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int sR, sC, eR, eC;
int dist[9][9];
queue<pair<int, int>> que;
int dr[8] = { 2,1,-1,-2,-2,-1,1,2 };
int dc[8] = { 1,2,2,1,-1,-2,-2,-1 };
void bfs() {
dist[sR][sC] = 1;
que.push(make_pair(sR, sC));
while (!que.empty()) {
int r = que.front().first, c = que.front().second; que.pop();
for (int i = 0; i < 8; i++) {
int rr = r + dr[i], cc = c + dc[i];
if (rr < 1 || rr > 8 || cc < 1 || cc > 8 || dist[rr][cc]) continue;
dist[rr][cc] = dist[r][c] + 1;
que.push(make_pair(rr, cc));
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> sR >> sC >> eR >> eC;
bfs();
cout << dist[eR][eC] - 1;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 30510 // C++] 토마에 함수 (1) | 2024.07.03 |
---|---|
[BOJ 30509 // C++] 그래서 나는 코딩을 그만두었다 (0) | 2024.07.02 |
[BOJ 14266 // C++] 이모티콘 (0) | 2024.06.30 |
[BOJ 27296 // C++] 카탈란 마스터의 선분 그리기 게임 (0) | 2024.06.29 |
[BOJ 5479 // C++] Pyramid (0) | 2024.06.28 |