본문 바로가기
에러 잡기/문제 풀이

백준 7562 나이트의 이동

by HJINHA 2021. 3. 26.

www.acmicpc.net/problem/7562

 

7562번: 나이트의 이동

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

www.acmicpc.net

 

쉬운 문제였는데 테스트 케이스 중간에 멈추길래 뭔가 했는데

그래프를 초기화하지 않아서 그랬던 것이었음.. 테스트케이스 여러번 돌릴 땐 초기화를 잘 하자 

#include<iostream>
#include<queue>

using namespace std;
int l, ax, ay, bx, by, sum;
int graph[300][300];

// 나이트의 이동 가능 범위
int dx[8] = { 1, 1, 2, 2, -1, -1, -2, -2 };
int dy[8] = { 2, -2, 1, -1, 2, -2, 1, -1 };

// 최단거리니까 bfs
void bfs(int x, int y) {
	queue<pair<int, int>> q;
	q.push({ x, y });

	while (!q.empty()) {
		int nx = q.front().first;
		int ny = q.front().second;
		q.pop();
		if (nx == bx && ny == by) {
			cout << graph[nx][ny] - 1 << "\n";;
			return;
		}
		for (int i = 0; i < 8; i++) {
			if ((nx + dx[i]) >= 0 && (nx + dx[i]) < l &&
				(ny + dy[i]) >= 0 && (ny + dy[i]) < l &&
				graph[nx + dx[i]][ny + dy[i]] == 0) {
				q.push({ nx + dx[i], ny + dy[i] });
				graph[nx + dx[i]][ny + dy[i]] = graph[nx][ny] + 1;
			}
		}
	}
}

int main(){
	int t;
	cin >> t;
	while (t--) {
		for (int i = 0; i < 300; i++) {
			for (int j = 0; j < 300; j++) {
				graph[i][j] = 0;
			}
		}
		cin >> l;
		cin >> ax >> ay;
		cin >> bx >> by;
		graph[ax][ay] = 1;
		bfs(ax, ay);
	}
}

'에러 잡기 > 문제 풀이' 카테고리의 다른 글

백준 13913 숨바꼭질4  (0) 2021.04.09
백준 12851 숨바꼭질 2  (0) 2021.04.03
백준 16953 A->B  (0) 2021.03.30
백준 1012 유기농 배추  (0) 2021.03.24
백준 1697 숨바꼭질  (0) 2021.03.24

댓글