알고리즘 문제분석
[BFS] 백준7562 나이트의 이동
danny0628
2021. 3. 29. 18:08
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
수행 시간 : 1시간
전형적인 BFS 문제이다. dx, dy의 좌표를 -2,-1,1,2 4개로 표현 해주면 쉽게풀린다.
++ 앞으로 bfs안에서 뭔가를 세줘야되면 queue에 넣어서 넘겨주는게 에러안나고 훨씬 편하다는걸 알게되었다.
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
int n, l;
vector <int> ans;
bool visited[301][301];
int nx, ny;
int dx[8] = { 1,2,2,1,-1,-2,-2,-1 };
int dy[8] = { -2,-1,1,2,2,1,-1,-2 };
int bfs(int x, int y) {
memset(visited, 0, sizeof(visited));
int cnt = 0;
queue < pair<pair<int, int>, int>> q;
visited[x][y] = true;
q.push(make_pair(make_pair(x, y), 0));
while (!q.empty()) {
int a = q.front().first.first;
int b = q.front().first.second;
int cnt = q.front().second;
q.pop();
if (a == nx && b == ny) {
return cnt;
}
for (int i = 0;i < 8;i++) {
int na = dx[i] + a;
int nb = dy[i] + b;
if (na >= 0 && na < l && nb >= 0 && nb < l) {
if (visited[na][nb] == false) {
visited[na][nb] = true;
q.push(make_pair(make_pair(na, nb), cnt + 1));
}
}
}
}
}
int main() {
cin >> n;
ans.resize(n);
for (int k = 0;k < n;k++) {
int x, y;
cin >> l;
cin >> x >> y >> nx >> ny;
ans[k] = bfs(x,y);
}
for (int i = 0;i < n;i++) {
cout << ans[i] << "\n";
}
}