7562번: 나이트의 이동
문제 체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까? 입력 입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ...
www.acmicpc.net
아이디어 : BFS
현재 위치에서 나이트가 갈 수 있는 곳을 Queue에 넣고 돌린다.
항상 문제는 BFS 돌리더라도 멈추는 조건을 분명히 해줘야한다.
의견 : 아직 BFS로 풀어야하는지, DFS로 풀어야하는지 감이 안 잡힌다.
감이 잡히는 사람은 댓글로
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int nTest;
int l;
int nDestY, nDestX;
int nCurY, nCurX;
int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
void BFS(int y, int x)
{
queue<pair<int, pair<int, int>>> q;
int nChecked[300][300] = { false, };
q.push(make_pair(0, make_pair(y, x)));
nChecked[y][x] = true;
while(!q.empty())
{
int cy = q.front().second.first;
int cx = q.front().second.second;
int cnt = q.front().first;
q.pop();
if (cy == nDestY && cx == nDestX)
{
cout << cnt << endl;
break;
}
for (int i = 0; i < 8; i++)
{
int ny = cy + dy[i];
int nx = cx + dx[i];
if (ny >= 0 && ny < l && nx >= 0 && nx < l)
{
if (false == nChecked[ny][nx])
{
nChecked[ny][nx] = true;
q.push(make_pair(cnt + 1, make_pair(ny, nx)));
}
}
}
}
}
int main(void)
{
cin >> nTest;
for (int i = 0; i < nTest; i++)
{
cin >> l;
cin >> nCurX >> nCurY;
cin >> nDestX >> nDestY;
BFS(nCurY, nCurX);
}
return 0;
}
'개발 > 백준' 카테고리의 다른 글
백준 1325번: 효율적인 해킹 (0) | 2019.09.24 |
---|---|
백준 1963번: 소수 경로 (0) | 2019.09.02 |
백준 1389번: 케빈 베이컨의 6단계 법칙 (0) | 2019.09.01 |
백준 11724번: 연결 요소의 개수 (0) | 2019.08.29 |
백준 11403번: 경로 찾기 (0) | 2019.08.28 |