Baekjoon 7562 (나이트의 이동)

Baekjoon 7562 (나이트의 이동)

Baekjoon 7562, 백준 7562 문제의 본인 풀이입니다!
문제는 아래의 링크에서 확인할 수 있습니다.
문제보기

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
52
53
54
55
56
57
#include <cstdio>
#include <cstring>
#include <queue>
#define MAX_LEN 300

typedef struct Knight {
int X;
int Y;
int dist;
};

// 8 ways of Knight moving
int direction[8][2] = { {2,1}, {1,2}, {-1,2}, {-2,1}, {-2,-1}, {-1,-2}, {1,-2}, {2,-1} };

int main() {
int testNum;
scanf("%d", &testNum);
while(testNum--) {
// Save inputs
int boardLen, startX, startY, endX, endY;
scanf("%d", &boardLen);
scanf("%d %d", &startX, &startY);
scanf("%d %d", &endX, &endY);

// BFS Settings
bool board[MAX_LEN+2][MAX_LEN+2]; // board[X][Y] = true if visited (X,Y)
memset(board, false, sizeof(board));
std::queue<Knight> q;
q.push(Knight{startX, startY, 0});

// Solve by BFS
while(!q.empty()) {
Knight topKnight = q.front();
board[topKnight.X][topKnight.Y] = topKnight.dist;
if(topKnight.X == endX && topKnight.Y == endY) {
// Arrived at the destination
printf("%d\n", topKnight.dist);
break;
}
// push next 8 locations to queue (if valid)
for(int i = 0; i < 8; i++) {
int tempX = topKnight.X + direction[i][0];
int tempY = topKnight.Y + direction[i][1];
// check if valid location
if(tempX >= 0 && tempX < boardLen && tempY >= 0 && tempY < boardLen) {
// only push when not visited before
if(!board[tempX][tempY]) {
q.push(Knight{tempX, tempY, topKnight.dist + 1});
board[tempX][tempY] = true; // check visited
}
}
}
// pop the top Knight of queue
q.pop();
}
}
}

흔한 유형의 BFS 문제였다. 문제를 보면 어 BFS인가?! 하는 느낌이 바로 온다.
본 코드만의 특징이라면 Knight 구조체를 이용하여 복잡한 STL의 사용 없이 직관적으로 쓰고, direction 배열을 이용하여 노가다성 코드를 최소화한 점..? 구조체는 워낙 유명하니 쓰면 좋고, direction 배열을 이용하는 아이디어는 많은 곳에서 적용이 될 것 같다. (본인도 처음 미로찾기 DP 문제 풀 때 다른 사람의 코드에서 참고했던 것 같다)

Author

Yeonsang Shin

Posted on

2021-02-15

Updated on

2022-12-19

Licensed under

Comments