[백준 / C언어] 7562번: 나이트의 이동 (BFS 풀이)

728x90
728x90

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

 

7562번: 나이트의 이동

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

www.acmicpc.net

 

난이도: solved.ac 실버 1

 

알고리즘 분류


그래프 탐색 (BFS)

 

접근 방법


최소 이동 횟수를 구하는 문제이므로 BFS로 접근하였다.

 

구현


위의 그림처럼 1시 방향부터 시작해 11시 방향까지 시계 방향으로 이동시키는 것을 한 단계로 큐에 넣어주었다.

방문한 좌표는 visited에 몇 번째로 이동한 건지 적어주었다.

 

 

코드


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define MAX 300

typedef struct _Queue {
	int y;
	int x;
} Queue;

Queue q[MAX * MAX + 1];
int visited[MAX][MAX];
int dy[8] = { -2,-1,1,2,2,1,-1,-2 };
int dx[8] = { 1,2,2,1,-1,-2,-2,-1 };
int front, rear;

void BFS(int py, int px, int desy, int desx, int I);

int main() {
	int T, I, i;
	int py, px, desy, desx;
	scanf("%d", &T);
	while (T) {
		scanf("%d", &I);
		scanf("%d %d", &py, &px);
		scanf("%d %d", &desy, &desx);

		BFS(py, px, desy, desx, I);
		printf("%d\n", visited[desy][desx]);

		for (i = 0; i < I; i++)
			memset(visited[i], 0, sizeof(int) * I);
		T--;
	}
	return 0;
}

void BFS(int py, int px, int desy, int desx, int I) {
	front = 0; rear = 0;
	q[rear].y = py;
	q[rear].x = px;
	visited[py][px] = 0;
	while (q[front].y != desy || q[front].x != desx) {
		int order = visited[q[front].y][q[front].x];
		for (int dir = 0; dir < 8; dir++) {
			int ny = q[front].y + dy[dir];
			int nx = q[front].x + dx[dir];
			if (ny >= 0 && ny < I && nx >= 0 && nx < I) {
				if (!visited[ny][nx]) {
					rear++;
					q[rear].y = ny;
					q[rear].x = nx;
					visited[ny][nx] = order + 1;
				}
			}
		}
		front++;
	}
}
반응형