알고리즘 : C++/BaekJoon

백준 2178번 - 미로 탐색

동 노이만 2023. 5. 20. 13:21

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

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

 

풀이 과정

 1과 0으로 이루어진 미로의 (0, 0)에서 (n - 1, m - 1)까지 최단 거리를 구하는 문제이다. 이때 가중치가 1로 일정하므로 BFS를 사용해서 문제를 풀었다. QUEUE를 이용해 BFS를 구현할 때, 이전 visited + 1 을 해줌으로서 첫 노드와 탐색 노드의 거리를 구했다.

 

느낀 점

 DFS를 주로 사용하다가 BFS를 사용하려하니 곧바로 코드가 생각나지 않았다. 하지만 큐와 4방향 탐색을 통해 찾아간다는 개념을 기반으로 천천히 구현하다보니 자연스럽게 구현되었다.

 

#include<bits/stdc++.h>
using namespace std;

int n, m;
char mp[101][101];
int visited[101][101];
int my[4] = { 1, 0, -1, 0 }, mx[4] = { 0, 1, 0, -1 };

void bfs(int y, int x) {
	//큐생성과 초기값 할당
	queue<pair<int, int>> q;
	q.push({ y, x });
	visited[y][x] = 1;

	while (q.size()) {
		for (int i = 0; i < 4; i++) { //4방향 탐색
			int ny = q.front().first + my[i];
			int nx = q.front().second + mx[i];
			if (ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx] || mp[ny][nx] == '0') continue;
			q.push({ ny, nx });
			visited[ny][nx] = visited[q.front().first][q.front().second] + 1;
		}
		if(!q.empty()) q.pop();
	}
	return;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	//입력
	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> mp[i][j];
		}
	}
	//수행
	bfs(0, 0);
	//출력
	cout << visited[n - 1][m - 1];

	return 0;
}