BOJ 2178 미로 탐색

Link

모든 경로의 가중치가 같을 때, bfs탐색은 최적을 보장합니다.
이 문제에서 가중치는 모두 1이라고 할 수 있겠네요. 위 특징을 이용할 수 있습니다.

지나야 하는 최소의 칸 수 = bfs를 이용하여 가장 먼저 도달할 때의 너비
라고 해석하고 문제를 풉시다.

코드 (C++)

#include <cstdio>
#include <queue>

using namespace std;

const int dx[4] = {-1, 1, 0, 0};
const int dy[4] = {0, 0, -1, 1};

bool map[100][100], visited[100][100];

int bfs(int N, int M) {
queue<int> Q;
Q.push(0);

int res = 1;
bool flag = false;
visited[0][0] = true;

while (true) {
int que_size = (int) Q.size();
for (int i = 0; i < que_size; i++) {
int x = Q.front() / 100;
int y = Q.front() % 100;
Q.pop();

if (x == N - 1 && y == M - 1) {
flag = true;
}

for (int d = 0; d < 4; d++) {
int now_x = x + dx[d];
int now_y = y + dy[d];
if (now_x < 0 || now_x >= N || now_y < 0 || now_y >= M) {
continue;
}
if (!map[now_x][now_y]) {
continue;
}
if (visited[now_x][now_y]) {
continue;
}
visited[now_x][now_y] = true;
Q.push(now_x * 100 + now_y);
}
}
if (flag) {
break;
}

res++;
}
return res;
}

int main(int argc, const char *argv[]) {
int N, M;
scanf("%d %d", &N, &M);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%1d", &map[i][j]);
}
}
printf("%d\n", bfs(N, M));

return 0;
}
Total views

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×