BOJ 18404

현명한 나이트

문제출처

문제 해석

  • 나이트가 상대편 말을 잡기 위한 최소 이동수를 각각 구하는 문제입니다.
  • 나이트와 말의 좌표가 정해집니다.
  • 나이트의 위치로부터 각 말을 잡기까지 이동해야하는 최소 이동수를 각각 출력하면 됩니다.

설계(5)

  • 단순 bfs알고리즘 문제입니다.
  • 나이트가 이동할 수 있는 모든 좌표를 탐색하여 최소이동수를 저장해놓습니다.
  • 주어진 말의 좌표의 최소이동수를 출력합니다.

구현(10)

코드
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define MAXN 500
#define MAXM 1001

int dist[MAXN][MAXN];
pair<int,int> coord[MAXM];
int N,M;
int sx,sy;
int dx[] = {-2,-2,-1,-1,1,1,2,2};
int dy[] = {-1,1,-2,2,-2,2,-1,1};
queue<pair<int,int> > q;
void bfs(){
    q.push({sx,sy});
    dist[sx][sy] = 0;
    while (!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for (int k = 0;k<8; k++){
            int nx = x + dx[k];
            int ny = y + dy[k];
            if (nx < 0 || ny<0 || nx>=N || ny>=N) continue;
            if (dist[nx][ny]!= -1) continue;
            dist[nx][ny] = dist[x][y] + 1;
            q.push({nx,ny});
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    memset(dist,-1,sizeof(dist));
    cin >> N >> M >> sx >> sy;
    sx--;
    sy--;
    for (int i = 1;i<=M;i++){
        int x,y;
        cin >> x >> y;
        x--;
        y--;
        coord[i] = {x,y};
    }
    bfs();
    for (int i = 1; i <=M; i++){
        cout << dist[coord[i].first][coord[i].second]<< " ";
    }
    return 0;
}

디버깅
제출결과
  • 8ms

마무리

  • 단순 bfs문제였습니다.