반응형
[문과 코린이의 IT 기록장] C++ 백준 문제풀이[그래프 1] - 나이트의 이동 (7562)
[ 문제 ]
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
[ 입력 ]
입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.
[ 출력 ]
각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.
[ 코드 ]
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int a[301][301]; // 체스판 이동 경로에 이동 횟수 기록용
int dx[] = { 1,2,2,1,-1,-2,-1,-2 };
int dy[] = { 2,1,-1,-2,-2,-1,2,1 };
queue <pair<int, int>> q;
int t; // 테스트 케이스 개수
int i; // 한 변의 길이 (체스판 크기 : ixi)
void bfs() {
while (!q.empty())
{
int x = q.front().first; // x1값
int y = q.front().second; // y1값
q.pop();
for (int k = 0; k < 8; k++)
{
int nx = x + dx[k];
int ny = y + dy[k];
if (0 <= nx && nx < i && 0 <= ny && ny < i)
{
if (a[nx][ny] == -1) // 아직 지나가지 않은 경로라면
// (첫번째로 그 지점이 채워지면, 즉 갈수있는 방향으로 모두 가보기 때문에 도착점에 먼저 도착하는 순간이 최소횟수가 됨)
{
a[nx][ny] = a[x][y] + 1;
q.push(make_pair(nx, ny));
}
}
}
}
}
int main() {
cin >> t;
while (t--)
{
memset(a, -1, sizeof(a)); // 기본 초기화 -1
int x1, y1; // 나이트가 현재있는 칸
int x2, y2; // 나이트가 이동하려고 하는 칸
cin >> i;
cin >> x1 >> y1;
cin >> x2 >> y2;
q.push(make_pair(x1, y1));
a[x1][y1] = 0; // 시작 값 0으로 초기화
bfs();
cout << a[x2][y2] << '\n';
}
return 0;
}
반응형
'문과 코린이의, [C. C++] 기록 > C++ 백준 문제풀이' 카테고리의 다른 글
[문과 코린이의 IT 기록장] C++ 백준 문제풀이[그래프 1] - 서울 지하철 2호선 (16947) (0) | 2021.11.11 |
---|---|
문과 코린이의 IT 기록장] C++ 백준 문제풀이[그래프 1] - Two Dots (16929) (0) | 2021.11.07 |
[문과 코린이의 IT 기록장] C++ 백준 문제풀이[그래프 1] - 토마토 (7576) (0) | 2021.10.01 |
[문과 코린이의 IT 기록장] C++ 백준 문제풀이[그래프 1] - 미로 탐색 (2178) (0) | 2021.09.27 |
[문과 코린이의 IT 기록장] C++ 백준 문제풀이[그래프 1] - 섬의 개수 (4963) (0) | 2021.09.27 |