[BOJ-Code] 7562 - 나이트의 이동

Posted by DHniyeo Blog on March 26, 2024

문제 링크

💡 너비 우선 탐색/그래프 이론/그래프 탐색

Memory 1580KB Time 20ms Code Length 996B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
struct info {
	int y, x, cnt;
};
int dy[] = { -2,-2,-1,-1,1,1,2,2 };
int dx[] = { 1,-1,-2,2,-2,2,1,-1 };

int visited[301][301];
void init() {
	memset(visited, 0, sizeof(visited));
}

int main() {
	int tc;
	int l;
	info start, end;
	scanf("%d", &tc);
	for (int T = 1; T <= tc; T++) {
		init();
		start.cnt = 0;
		scanf(" %d", &l);
		scanf(" %d %d", &start.y, &start.x);
		scanf(" %d %d", &end.y, &end.x);

		queue<info> q;
		q.push(start);
		visited[start.y][start.x] = 1;

		int result = 0;
		while (!q.empty()) {
			info tmp = q.front(); q.pop();

			if (tmp.y == end.y && tmp.x == end.x) {
				result = tmp.cnt;
				break;
			}
			for (int i = 0; i < 8; i++) {
				int ny = tmp.y + dy[i];
				int nx = tmp.x + dx[i];
				if (ny >= l || nx >= l || nx < 0 || ny < 0) continue;
				if (visited[ny][nx] == 1) continue;
				visited[ny][nx] = 1;
				q.push({ ny, nx, tmp.cnt + 1 });
			}
		}
		printf("%d\n", result);
	}
}

이 코드는 나이트의 이동 경로를 구하는 문제를 해결하는 프로그램이다.

먼저, 입력으로 테스트 케이스의 개수를 받고, 각 테스트 케이스마다 시작점과 도착점의 좌표를 입력받는다.

그 후, 방문한 위치를 표시하기 위한 visited 배열을 초기화하고, 시작점을 큐에 넣고 방문했음을 표시한다.

큐가 빌 때까지 다음을 반복한다: 큐에서 하나의 위치를 꺼내서 해당 위치가 도착점인지 확인하고, 아니라면 나이트의 이동 가능한 8가지 방향을 확인하여 갈 수 있는 위치를 큐에 넣고 방문했음을 표시한다.

도착점에 도달하면 해당 위치까지의 이동 횟수를 결과로 저장하고 반복을 종료한다.

마지막으로 결과를 출력한다.