본문 바로가기
Algorithm/DFS&BFS(완전탐색)

7562 나이트의 이동

by neohtux 2020. 2. 13.
728x90

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

 

7562번: 나이트의 이동

문제 체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까? 입력 입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ...

www.acmicpc.net

 

<개인 풀이>

1. 시작점부터 끝점까지 BFS 탐색

 

2. BFS 탐색이 끝나면, 도착지점의 거리 값을 불러온다.

 

3. 테스트케이스 수 만큼 반복.

 

#include<stdio.h>
#include<queue>
#include<cstring>
int check[300][300];

int dx[] = { 1, 2, 2, 1, -1, -2, -2, -1 };
int dy[] = { 2, 1, -1, -2, -2, -1, 1, 2 };

using namespace std;
int size; //체스판 크기 

int sx, sy; //start x,y 
int ex, ey; //end x,y
int bfs(int x, int y, int cnt);
int main(void)
{
	int n = 0; //테스트 케이스수

	scanf("%d", &n);
	
	while (n--)
	{
		scanf("%d", &size);
		scanf("%d %d", &sx, &sy);
		scanf("%d %d", &ex, &ey);

		int ans=bfs(sx, sy,1);
		printf("%d\n", ans);
		memset(check, 0, sizeof(check));
	}

	return 0;
}

int bfs(int x, int y, int cnt)
{
	queue<pair<int, int>> q;
	q.push(make_pair(x, y));
	check[x][y] = cnt;
	if (x == ex && y == ey)
	{
		return check[x][y] - 1;
	}
	while (!q.empty())
	{
		int x = q.front().first;
		int y = q.front().second;
		q.pop();
		for (unsigned short i = 0; i < 8; ++i)
		{
			int xn = x + dx[i];
			int yn = y + dy[i];

			if (xn >= 0 && xn < size && yn >= 0 && yn < size&&
				check[xn][yn] == 0)
			{

				check[xn][yn] = check[x][y] + 1;

				if (xn == ex&&yn == ey)
				{
					return check[xn][yn] - 1;
				}
				q.push(make_pair(xn, yn));
			}
		}

	}
}
300x250

'Algorithm > DFS&BFS(완전탐색)' 카테고리의 다른 글

2146 다리 만들기  (0) 2020.02.14
16947 서울 지하철 2호선  (0) 2020.02.13
16929 Two Dots  (0) 2020.02.12
7576 토마토  (0) 2020.02.11
2178 미로탐색  (0) 2020.02.11

댓글