-
백준(BOJ) 7562번 나이트의 이동알고리즘 풀이/백준(Boj) 2019. 8. 6. 03:26
문제 : https://www.acmicpc.net/problem/7562
문제체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
나의 풀이:
큐에 pair<pair<int,int>,int> 를 통하여 앞에 값에는 y값과 x값을 , 뒤에 값은 이동 횟수로 지정하여 0을 넣고 1씩 증가하여 도착 시 이동 횟수를 저장 하였다.
코드 ( C++ )
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
int l;
int x, y, dx, dy;
// 나이트의 이동 방향
int my[8] = { 2,1,-2,-1,-1,-2,1,2 };
int mx[8] = { -1, -2, 1, 2, -2, -1, 2, 1 };
const int MAX = 300;
int chess[MAX][MAX];
bool visited[MAX][MAX];
// 이동 횟수 저장 cnt
int cnt;
void BFS(int y, int x)
{
visited[y][x] = true;
queue<pair<pair<int, int>, int>> q;
// 처음은 y, x 값과 이동 횟수가 0이니 0을 넣어준다.
q.push(make_pair(make_pair(y, x), 0));
while (!q.empty())
{
// q에 다음 나올 y ,x 값이 도착 값과 같다면
if (q.front().first.first == dy && q.front().first.second == dx)
{
// 그때에 이동 횟수를 저장하고 마친다.
cnt = q.front().second;
return;
}
for (int i = 0; i < 8; ++i)
{
int ny = q.front().first.first + my[i];
int nx = q.front().first.second + mx[i];
int num = q.front().second;
if (ny >= 0 && ny < l && nx >= 0 && nx < l)
if (visited[ny][nx] == false)
{
visited[ny][nx] = true;
// num은 다음 칸으로 이동하니 +1 해준다.
q.push(make_pair(make_pair(ny, nx), num + 1));
}
}
q.pop();
}
}
int main()
{
int C;
cin >> C;
while (C--) {
// chess 와 visited 배열 초기화
memset(chess, 0, sizeof(chess));
memset(visited, 0, sizeof(visited));
cnt = 0;
cin >> l;
cin >> y >> x;
cin >> dy >> dx;
BFS(y, x);
cout << cnt << endl;
}
return 0;
}
'알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 6359번 만취한 상범 (0) 2019.08.07 백준(BOJ) 2110번 공유기 설치 (0) 2019.08.06 백준(BOJ) 1987번 알파벳 (0) 2019.08.04 백준(BOJ) 1019번 책 페이지 (0) 2019.08.03 백준(BOJ) 1449번 수리공 항승 (0) 2019.08.03