문제
NxN 크기 체스판의 특정한 위치에 하나의 나이트가 존재한다. 이때 M개의 상대편 말들의 위치 값이 주어졌을 때, 각 상대편 말을 잡기 위한 나이트의 최소 이동 수를 계산하는 프로그램을 작성하시오.
나이트는 일반적인 체스(Chess)에서와 동일하게 이동할 수 있다. 현재 나이트의 위치를 (X,Y)라고 할 때, 나이트는 다음의 8가지의 위치 중에서 하나의 위치로 이동한다.
(X-2,Y-1), (X-2,Y+1), (X-1,Y-2), (X-1,Y+2), (X+1,Y-2), (X+1,Y+2), (X+2,Y-1), (X+2,Y+1)
N=5일 때, 나이트가 (3,3)의 위치에 존재한다면 이동 가능한 위치는 다음과 같다. 나이트가 존재하는 위치는 K, 이동 가능한 위치는 노란색으로 표현하였다.
예를 들어 N=5, M=3이고, 나이트가 (2,4)의 위치에 존재한다고 가정하자. 또한 상대편 말의 위치가 차례대로 (3,2), (3,5), (4,5)라고 하자. 이때 각 상대편 말을 잡기 위한 최소 이동 수를 계산해보자. 아래 그림에서는 상대편 말의 위치를 E로 표현하였다. 단, 본 문제에서 위치 값을 나타낼 때는 (행,열)의 형태로 표현한다.
각 상대편 말을 잡기 위한 최소 이동 수는 차례대로 1, 2, 1이 된다.
입력
첫째 줄에 N과 M이 공백을 기준으로 구분되어 자연수로 주어진다. (1 ≤ N ≤ 500, 1 ≤ M ≤ 1,000) 둘째 줄에 나이트의 위치 (X, Y)를 의미하는 X와 Y가 공백을 기준으로 구분되어 자연수로 주어진다. (1 ≤ X, Y ≤ N) 셋째 줄부터 M개의 줄에 걸쳐 각 상대편 말의 위치 (A, B)를 의미하는 A와 B가 공백을 기준으로 구분되어 자연수로 주어진다. (1 ≤ A, B ≤ N)
단, 입력으로 주어지는 모든 말들의 위치는 중복되지 않으며, 나이트가 도달할 수 있는 위치로만 주어진다.
출력
첫째 줄에 각 상대편 말을 잡기 위한 최소 이동 수를 공백을 기준으로 구분하여 출력한다.
단, 출력할 때는 입력 시에 상대편 말 정보가 주어졌던 순서에 맞게 차례대로 출력한다.
Solved.ac 레벨
실버 I
풀이
#include <bits/stdc++.h>
using namespace std;
int n;
bool visited[501][501];
int dx[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
int dy[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
int dis[501][501];
int result[1001];
void BFS(pair<int, int> p) {
queue<pair<int, int> > q;
dis[p.first][p.second] = 0;
visited[p.first][p.second] = true;
q.push(p);
while(!q.empty()) {
int cx = q.front().first;
int cy = q.front().second;
q.pop();
for(int i = 0; i < 8; i++) {
int nx = cx + dx[i];
int ny = cy + dy[i];
if(nx >= 0 && ny >= 0 && nx < n && ny < n) {
if(!visited[nx][ny]) {
visited[nx][ny] = true;
dis[nx][ny] = dis[cx][cy] + 1;
q.push(make_pair(nx, ny));
}
}
}
}
}
void reset() {
int visited = { 0, };
int dis = { 0, };
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int m, x, y;
cin >> n >> m >> x >> y;
for(int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
BFS(make_pair(x - 1, y - 1));
result[i] = dis[a - 1][b -1];
}
for(int i = 0; i < m; i++){
cout << result[i] << " ";
}
cout << "\n";
return 0;
}
'Study (etc)' 카테고리의 다른 글
[BOJ / C++] 2023번 : 신기한 소수 (0) | 2023.05.19 |
---|---|
[BOJ / C++] 2161번 : 카드 (0) | 2022.11.09 |