문제
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
입력
입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.
출력
각 테스트 케이스마다 나이트가 몇 번만에 이동할 수 있는지 출력한다.
BFS로 탐색하면된다.
가장중요한것 결과를찾았을때 큐안에 값이 다빠진상태가 아닐수있으므로 초기화해야 한다.. 이거떄문에 2시간날림 ㅠ.
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 <iostream> using namespace std; #include <string.h> #include <queue> int arr[305][305]; int dx[8] = { -1,-2,-2,-1,1,2,2,1 }; int dy[8] = { -2,-1,1,2,2,1,-1,-2 }; int T; int N; int sx, sy, desx, desy; void BFS() { queue <pair<pair<int, int>, int>> q; arr[sx][sy] = 1; q.push(make_pair(make_pair(sx, sy), 0)); while (!q.empty()) { int cur_x = q.front().first.first; int cur_y = q.front().first.second; int cnt = q.front().second; q.pop(); if (cur_x == desx && cur_y == desy) { printf("%d\n", cnt); return; } for (int i = 0; i < 8; i++) { int n_x, n_y; n_x = cur_x + dx[i]; n_y = cur_y + dy[i]; if (n_x < 0 || n_x >= N || n_y < 0 || n_y >= N) continue; if (arr[n_x][n_y]) continue; arr[n_x][n_y] = 1; q.push(make_pair(make_pair(n_x, n_y), cnt + 1)); } } } int main() { int i, j, k; scanf("%d", &T); for (i = 0; i < T; i++) { scanf("%d", &N); scanf("%d %d %d %d", &sx, &sy, &desx, &desy); memset(arr, 0, sizeof(arr)); BFS(); } } | cs |
'백준 알고리즘' 카테고리의 다른 글
[C언어,C++] 백준알고리즘 1526번 가장 큰 금민수 (0) | 2019.12.23 |
---|---|
[C언어] 백준알고리즘 2156번 포도주 문제 (0) | 2019.07.17 |
[C++] 백준알고리즘 1309번 동물원 문제 (0) | 2019.07.17 |
[C++] 백준알고리즘 BFS 1389번 케빈 베이컨의 6단계 법칙 (0) | 2019.05.30 |
[C++] 백준알고리즘 BFS 2589번 보물섬 문제 (0) | 2019.05.27 |