티스토리 뷰

Algorithm/BOJ

백준 7562번 C++

poopooreum 2023. 8. 22. 10:32
반응형
백준 7562번 나이트의 이동

https://www.acmicpc.net/problem/7562

7562번: 나이트의 이동

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

www.acmicpc.net



정답 코드

#include<iostream>
#include<queue>
using namespace std;
int vis[305][305]; //횟수를 기록하는 배열
int dx[8] = { -2,-2,-1,-1,1,1,2,2 };
int dy[8] = { 1,-1,2,-2,2,-2,1,-1 };
queue<pair<int, int>>q;
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int test;
	cin >> test;
	for (int i = 0; i < test; i++) {
		int len, x, y, x_final, y_final;
		cin >> len;
		cin >> x >> y;
		cin >> x_final >> y_final;
		if (x == x_final && y == y_final) {
			cout << '0' << '\n';
			continue;
		}
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < len; j++)
				vis[i][j] = -1;
		}
		vis[x][y] = 0;
		q.push({ x,y });
		while (!q.empty()) {
			pair<int, int>cur = q.front();
			q.pop();
			for (int d = 0; d < 8; d++) {
				int mx = cur.first + dx[d];
				int my = cur.second + dy[d];
				if (mx < 0 || my < 0 || mx >= len || my >= len)
					continue;
				if (vis[mx][my] >= 0)
					continue;
				vis[mx][my] = vis[cur.first][cur.second] + 1;
				q.push({ mx,my });

			}
		}
		cout << vis[x_final][y_final] << "\n";
	}
}

문제 풀이

bfs를 이용해서 풀었습니다. 먼저 vis배열을 -1로 초기화시켰습니다. 그 다음 입력받은 좌표를 큐에 집어넣고 이 좌표를 기점으로 bfs를 돌렸습니다. 움직일 수 있는 방향은 8개이므로 dx,dy배열을 8칸씩 만들었습니다.
범위를 벗어나거나 이미 방문한 곳은 continue하도록 설정하였고 이 두 가지의 경우가 아닐 때에는 큐에 좌표를 집어넣고
vis[mx][my] = vis[cur.first][cur.second] + 1;
를 통해 이동 횟수를 더해주었습니다.

반응형

'Algorithm > BOJ' 카테고리의 다른 글

백준 7569번 C++  (0) 2023.08.22
백준 7568번 C++  (0) 2023.08.22
백준 7287번 C++  (0) 2023.08.21
백준 6718번 C++  (0) 2023.08.21
백준 6603번 C++  (0) 2023.08.21
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함