PS/깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]

백준 16948 데스 나이트(c++)

SeungbeomKim 2023. 1. 29. 16:53

https://www.acmicpc.net/problem/16948

 

16948번: 데스 나이트

게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다. 크

www.acmicpc.net

가장 기본적인 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]까지 가기 위한 최소 이동 횟수라고 볼 수 있습니다.