백준문제풀이/BFS

7562번-나이트의 이동

반응형

문제

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

 

7562번: 나이트의 이동

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

www.acmicpc.net


접근방법

1) 접근 사고

1. 나이트의 이동 좌표에 대한 설정값을 구해줍니다.

2. bfs 탐색을 통해 나이트의 이동에 대한 탐색을 시작합니다.

3. 이때 1초당 걸리는 탐색의 경우의 수는 탐색을 진행할 때 queue의 크기와 같으므로 탐색을 시작할 때 큐의 크기만큼 탐색을 진행하고 시간을 1증가 시켜줍니다.

 

2) 시간 복잡도

O(V+E)

 

3) 실수

 

4) 배운점

 

5) PS

다른 문제풀이를 보니 INT형의 dists 이차원 배열을 사용해 초기에 값을 -1로 초기화해서 중복을 제어하는 형식의 코드도 있는거 같은데 시간이 있을때 다시 풀어봐야 할 거 같습니다.

 


정답 코드

#include<bits/stdc++.h>

using namespace std;

const int MAX = 305;
int t;
int r;
pair<int, int> start, goal;
bool visited[MAX][MAX];
int moveY[] = { -1, -2, -2, -1, 1, 2, 2, 1  };
int moveX[] = { -2, -1, 1, 2, -2, -1, 1, 2 };

int bfs(){
	queue<pair<int, int>> q;
	q.push(start);
	visited[start.first][start.second] = true;
	int count = 0;
	while (!q.empty()){
		int qSize = q.size();
		for (int i = 0; i < qSize; i++){
			int y = q.front().first;
			int x = q.front().second;
			q.pop();

			if (y == goal.first && x == goal.second){
				return count;
			}

			for (int d = 0; d < 8; d++){
				int ny = y + moveY[d];
				int nx = x + moveX[d];

				if (ny >= 0 && ny < r && nx >= 0 && nx < r){
					if (!visited[ny][nx]){
						q.push({ ny, nx });
						visited[ny][nx] = true;
					}
				}
			}
		}
		count++;
	}
	return count;
}

void pro(){
	memset(visited, false, sizeof(visited));
	int ans = bfs();
	cout << ans << "\n";
}

void input(){
	cin >> r;
	cin >> start.first >> start.second;
	cin >> goal.first >> goal.second;
}

int main(){
	cin >> t;
	while (t--){
		input();
		pro();
	}
}
반응형

'백준문제풀이 > BFS' 카테고리의 다른 글

3184번-양  (0) 2022.04.14
4963번-섬의 개수  (0) 2022.04.14
1012번-유기농배추  (0) 2022.04.14