PS/BaekJoon

[BaekJoon 7562번] 나이트의 이동(C++)

박땅콩 2022. 8. 5.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

 

 

[문제 설명]

 

 

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?

 

 

[입력]

 

 

입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.

각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.

 

 

[출력]

 

 

각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.

 

 

[입출력 예]

 

 

입력 출력
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
5
28
0

 

 

[문제 풀이]

 

쉬웠던 문제

BFS 알고리즘으로 풀면 되는데, 하나 주의할 점이 있다.

문제의 그림에서 나이트가 이동할 수 있는 경우의 수를 알려주었다.(8가지)

 

이전의 다른 문제들은 보통 상 하 좌 우의 이동을 했지만

이 문제는 그림에서 주어진 8가지 이동에 따른 다음 좌표를 확인해야한다.

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/BAEKJOON: Study BaekJoon for Coding Test

Study BaekJoon for Coding Test. Contribute to SmallPeanutPark/BAEKJOON development by creating an account on GitHub.

github.com

 

 

#include <iostream>
#include <queue>
#include <utility>

using namespace std;

int dx[8] = { 2, 1, -1, -2, -2,  -1, 1, 2};
int dy[8] = { 1, 2, 2,  1,  -1, -2, -2, -1};


int main(void) {
	int N;
	cin >> N; // 테스트 케이스 개수
	for (int i = 0; i < N; ++i) {
		int l; // 체스판의 한변의 길이
		cin >> l;
		
		int dist[301][301] = { 0, }; // 거리 - 이동해야하는 칸
		bool visited[301][301] = { false, };

		queue<pair<int, int>> q;
		int firstx, firsty; // 나이트가 현재 있는 칸
		cin >> firstx >> firsty;
		q.push({ firstx, firsty });

		int finalx, finaly; // 나이트가 이동하려는 칸
		cin >> finalx >> finaly;

		dist[firstx][firsty] = 0;
		visited[firstx][firsty] = true;
		while (!q.empty()) {
			pair<int, int> curlocation = q.front();
			q.pop();
			for (int k = 0; k < 8; ++k) {
				int nx = curlocation.first + dx[k];
				int ny = curlocation.second + dy[k];
				if (nx < 0 || nx >= l || ny < 0 || ny >= l) continue;
				if (visited[nx][ny]) continue;
				q.push({ nx, ny });
				visited[nx][ny] = true;
				dist[nx][ny] = dist[curlocation.first][curlocation.second] + 1;
			}
		}
		cout << dist[finalx][finaly] << '\n';
	}

	return 0;
}
728x90

'PS > BaekJoon' 카테고리의 다른 글

[BaekJoon 7569번] 토마토(C++)  (0) 2022.08.06
[BaekJoon 3986번] 좋은 단어(C++)  (0) 2022.08.05
[BaekJoon 10026번] 적록색약(C++)  (0) 2022.08.05
[BaekJoon 1012번] 유기농 배추(C++)  (0) 2022.08.05
[BaekJoon 2798번] 블랙잭(C++)  (0) 2022.08.04

댓글