영벨롭 개발 일지

[백준 BOJ][C++]7562번 나이트의 이동 풀이: BFS 본문

알고리즘 문제 풀이/BOJ

[백준 BOJ][C++]7562번 나이트의 이동 풀이: BFS

영벨롭 2022. 4. 11. 18:03

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

 

7562번: 나이트의 이동

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

www.acmicpc.net

 

 

#include<iostream>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>

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 };

typedef pair<int, int> coord;

typedef struct node {
	coord loc;
	int depth;
};

coord s, e;
int t, n;
bool visit[301][301] = { false, };

int bfs() {
	queue<node> q;

	q.push({ s, 0 });
	visit[s.second][s.first] = true;

	while (!q.empty()) {
		node curr = q.front();
		q.pop();

		if (curr.loc == e) {
			return curr.depth;
		}

		for (int i = 0; i < 8; i++) {
			int tx = curr.loc.first + dx[i];
			int ty = curr.loc.second + dy[i];

			if (tx < 0 || tx >= n || ty < 0 || ty >= n)
				continue;
			if (visit[ty][tx])
				continue;
			visit[ty][tx] = true;
			q.push({ {tx, ty}, curr.depth + 1 });
		}
	}

}

int main(void) {
	
	cin >> t;

	while (t > 0) {
		cin >> n;

		int x, y;
		cin >> x >> y;
		s.first = x;
		s.second = y;
		cin >> x >> y;
		e.first = x;
		e.second = y;

		memset(visit, false, sizeof(visit));

		int ret = bfs();
		cout << ret << endl;

		t--;
	}
	

	return 0;
}
반응형