https://www.acmicpc.net/problem/16948
가장 기본적인 BFS 문제입니다. 이동 경우의 수가 보기와 같이 6가지 이고, 인접 노드를 방문하면서, 연산 횟수를 하나씩 증가시켜주면 끝나는 문제입니다. 개인적으로 BFS 입문 문제로 괜찮은 문제라고 생각합니다.
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int mov[6][2] = {{-2, -1}, {-2, 1}, {0, -2}, {0, 2}, {2, -1}, {2, 1}};
int dist[200][200];
int main()
{
int n;
cin >> n;
int sx, sy, ex, ey;
cin >> sx >> sy >> ex >> ey; // 시작점, 도착점
memset(dist, -1, sizeof(dist));
// 방문여부 처음에는 방문하지 않았으므로 -1로 초기화
dist[sx][sy] = 0;
queue<pair<int, int>> q;
q.push(make_pair(sx, sy));
while (!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int k = 0; k < 6; k++)
{
int nx = x + mov[k][0];
int ny = y + mov[k][1];
if (0 <= nx && nx < n && 0 <= ny && ny < n)
{
if (dist[nx][ny] == -1)
{
q.push(make_pair(nx, ny));
dist[nx][ny] = dist[x][y] + 1;
}
}
}
}
cout << dist[ex][ey] << '\n';
return 0;
}
거리를 -1로 초기화해주고(방문하지 않았기 때문), 방문하지 않았으면 기존 방문 횟수를 이전 방문 횟수에서 1 증가시켜주면 됩니다. ex, ey는 도착지이기 때문에 dist[ex][ey]는 dist[sx][sy]에서 dist[ex][ey]까지 가기 위한 최소 이동 횟수라고 볼 수 있습니다.
'PS > 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]' 카테고리의 다른 글
백준 16946 벽 부수고 이동하기(c++) (0) | 2023.02.14 |
---|---|
백준 7569 토마토(c++) (0) | 2023.02.05 |
백준 9019 DSLR(c++) (0) | 2023.01.29 |
백준 16928 뱀과 사다리 게임(c++) (0) | 2023.01.29 |
백준 16917 두 동전(c++) (0) | 2023.01.28 |