-
[2178] 미로 탐색BOJ 2021. 10. 16. 09:59
https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
<문제>
bfs의 중요한 특성중 하나이자, dfs로는 못풀지만 bfs로 풀리는 문제가 존재하는 이유는
"먼저 도착하는것이 최적해"라는 특징이며, 이를 활용하는 문제라고 할수 있다.
매 정점마다 도착지점인지를 검사하고
도착지점이라면 바로 break하는것이 dfs보다 더 빠를 수 있는 가능성을 보여준다.
<소스코드>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <bits/stdc++.h>using namespace std;typedef struct {int y, x, turn;} state; //(y,x) <-> (R,C)int Map[101][101], dy[4] = {0, 1, 0, -1}, dx[4] = {1, 0, -1, 0};int n, m; // maxRow,maxColumn of mapvoid input(void) {cin >> n >> m;string temp;for (int i = 0; i < n; i++) {cin >> temp;for (int j = 0; j < m; j++) {Map[i][j] = temp[j] - '0'; // string -> int}}return;}void bfs(int startY, int startX) {// initqueue<state> q;q.push({startY, startX, 1}); // default turn is 1, including (1,1)bool visited[101][101];memset(visited, 0, sizeof(visited));visited[startY][startX] = true;// searchwhile (!q.empty()) {state cur = q.front();q.pop();// check answerif (cur.y == n - 1 && cur.x == m - 1) {cout << cur.turn;return;}for (int i = 0; i < 4; i++) {int nextY = cur.y + dy[i];int nextX = cur.x + dx[i];if (nextY < 0 || nextX < 0 || startY >= n || startX >= m)continue; // out of boundif (Map[nextY][nextX] == 1 && visited[nextY][nextX] == false) {q.push({nextY, nextX, cur.turn + 1});visited[nextY][nextX] = true;}}}}int main(void) {input();bfs(0, 0);return 0;}cs 'BOJ' 카테고리의 다른 글
[16948] 데스 나이트 (0) 2021.10.17 [7562] 나이트의 이동 (0) 2021.10.16 [4963] 섬의 개수 (0) 2021.10.16 [7569] 토마토 (0) 2021.10.16 [2667] 단지번호붙이기 (0) 2021.10.16