알고리즘 모음(C++)

백준 16948 - 데스 나이트(C++) 본문

백준

백준 16948 - 데스 나이트(C++)

공대생의 잡다한 사전 2022. 4. 18. 21:11

문제 링크입니다. https://www.acmicpc.net/problem/16948

 

16948번: 데스 나이트

게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다. 크

www.acmicpc.net

BFS를 이용한 간단한 문제입니다.

해당 이동 방향으로 움직일 수 없으면 -1를 이동할 수 있으면 이동한 횟수를 출력하는 문제입니다.

 

체스가 움직일 수 있는 방향은 (-2, -1) / (-2, 1) / (0, -2) / (0, 2) / (2 , -1) / (2, 1) 입니다.

시작 위치를 queue에 넣어준 뒤 BFS 탐색을 시작합니다.

해당 이동방향으로 이동해보면서 MAP의 범위 안에 들어가며 이전에 방문하지 않은 곳을 방문합니다.

 

BFS 탐색이 끝났는 경우에도 도착 위치에 도착하지 못했다면 -1를 출력해주면 됩니다.

 

 

자세한 것은 코드를 참고해주세요

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <stack>
#include <algorithm>
#include <cmath>

using namespace std;

int N;
pair<int, int> start, fin;
int check[201][201];
int dx[6] = { -2,-2,0,0,2,2 };
int dy[6] = { -1,1,-2,2,-1,1 };

int bfs() {
	queue<pair<int, int>> q;
	q.push(start);
	check[start.first][start.second] = 1;
	while (!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		q.pop();
		if (x == fin.first && y == fin.second) break;
		for (int i = 0; i < 6; i++) {
			int xx = x + dx[i];
			int yy = y + dy[i];
			if (xx >= 0 && yy >= 0 && xx < N && yy < N) {
				if (check[xx][yy] == 0) {
					check[xx][yy] = check[x][y] + 1;
					q.push({ xx,yy });
				}
			}
		}
	}
	if (check[fin.first][fin.second] == 0) return -1;
	else return check[fin.first][fin.second] - 1;
}

void solve() {
	int ans = bfs();
	cout << ans;
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N;
	cin >> start.first >> start.second >> fin.first >> fin.second;
	solve();
	return 0;
}

 

 

질문 및 조언 댓글 남겨주세요

'백준' 카테고리의 다른 글

백준 1931 - 회의실 배정(C++)  (0) 2022.04.28
백준 1303- 전쟁 - 전투(C++)  (0) 2022.04.19
백준 18045 - 경쟁적 전염(C++)  (0) 2022.04.12
백준 3184 - 양(C++)  (0) 2022.04.12
백준 2665 - 미로만들기(C++)  (0) 2022.03.26