반응형
문제
알고리즘 분류 : 너비 우선 탐색(BFS)
접근 방법
BFS를 몰라서 검색해봤다. 만들기는 매우 쉬웠던 것 같다. (youtu.be/_hxFgg7TLZQ?t=193이거 3분 13초 ~ 5분까지 봤음.) BFS는 깊이를 기준으로 깊이가 1인 노드 탐색 -> 2인 노드 탐색 -> 3인 노드 탐색... 으로 진행되는데, 여기서 깊이(자식) = 체스말의 이동 횟수라고 생각하면 금방 해결할 수 있는 문제였다.
탐색 순서는 사실 한번 이동해서 갈 수 있는곳 -> 두번 이동해서 갈 수 있는곳 -> 세번 이동해서 갈 수 있는... 이런식으로 상당히 비효율적으로 진행되는 것 같다.
코드
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
58
59
|
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
bool QueCheck[300][300] = { false, };
struct int3
{
int x;
int y;
int Count;
};
void Knight(int MapSize, int StartX, int StartY, int EndX, int EndY)
{
int Move1[8] = {1, 1, 2, 2, -1, -1, -2, -2 };
int Move2[8] = {2, -2, 1, -1, -2, 2, -1, 1 };
int Count = 0;
memset(QueCheck, false, sizeof(QueCheck));
queue<int3> Que;
Que.push({ StartX, StartY, 0 });
while (true)
{
if (Que.front().x == EndX && Que.front().y == EndY)
{
cout << Que.front().Count << endl;
return;
}
for (int i = 0; i < 8; ++i)
{
if (Que.front().x + Move1[i] < 0 || Que.front().x + Move1[i] > MapSize-1 || Que.front().y + Move2[i] < 0 || Que.front().y + Move2[i] > MapSize-1)
continue;
if (!QueCheck[Que.front().x + Move1[i]][Que.front().y + Move2[i]])
{
QueCheck[Que.front().x + Move1[i]][Que.front().y + Move2[i]] = true;
Que.push({ Que.front().x + Move1[i], Que.front().y + Move2[i], Que.front().Count +1});
}
}
Que.pop();
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int Num;
cin >> Num;
for (int i = 0; i < Num; ++i)
{
int a, s, d, f, g;
cin >> a >> s >> d >> f >> g;
Knight(a,s,d,f,g);
}
}
|
cs |
반응형
'코딩 > 문제풀이-백준' 카테고리의 다른 글
백준 1715번 - 카드 정렬하기 (C++) (0) | 2021.04.27 |
---|---|
백준 14503번 - 로봇 청소기 (C++) (0) | 2021.04.09 |
백준 1929번 - 소수 구하기 C++ (0) | 2021.04.08 |
백준 2504번 - 괄호의 값 (C++) (0) | 2021.04.04 |
백준 6198번 - 옥상 정원 꾸미기 (C++) (0) | 2021.04.03 |
댓글