본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 2665 미로만들기

by 까망 하르방 2021. 3. 31.
반응형

출처https://www.acmicpc.net/problem/2665

Approach

BFS 혹은 DFS 이용해서 해결할 수 있다.

BFS (Breadth-First Search, 너비 우선 탐색) 

 

BFS (Breadth-First Search, 너비 우선 탐색)

BFS 그래프 전체를 탐색하되, 인접한 노드들을 차례대로 방문합니다. Queue 이용 * DFS로 풀리는 문제는 일반적으로 BFS로도 풀 수 있습니다. Process ※ 깊이 우선 탐색과는 달리 너비 우선 탐색에서

zoosso.tistory.com

 

DFS (depth-first search, 깊이 우선 탐색) 

 

깊이 우선 탐색(depth-first search, DFS)

DFS 그래프의 모든  정점을 방문할 때 최대한 깊숙히 정점을 방문하는 방식입니다. - Stack 이용 즉, 연결된 정점을 따라 계속 순회하다가 갈 곳이 없어지며 바로 이전단계로 가는 백트래킹 방식.

zoosso.tistory.com

 

DFS와 BFS 비교 

 

DFS와 BFS 비교

출처: 나무위키 경로 비교 BFS - Queue 이용 - 최소신장트리(Minimum Spanning Trees), 최단경로(Shortest Paths) 장점: 무한히 깊거나 무한에 가까운 트리인 경우에 효과적 단점: 목표 노드로 가는 경로들 모..

zoosso.tistory.com

 

DFS

#include <stdio.h>
const int MAX_N = 50 + 2;
int N, A[MAX_N][MAX_N], L[MAX_N][MAX_N];
int dx[] = { 0, 0, 1, -1 }, dy[] = { 1, -1, 0, 0 };
char str[MAX_N];

void input() {
    scanf("%d", &N);
    for (int i = 1; i <= N; ++i) {
        scanf("%s", str + 1);
        for (int j = 1; j <= N; ++j) {
            A[i][j] = 1 - (str[j] - '0');
            L[i][j] = 99;
        }
    }
}
void DFS(int x, int y, int lev) {
    if (x < 1 || x > N || y < 1 || y > N)
        return;

    if (L[x][y] <= lev + A[x][y])
        return;

    L[x][y] = lev + A[x][y];

    for (int i = 0; i < 4; ++i) {
        DFS(x + dx[i], y + dy[i], L[x][y]);
    }
}

int main() {
    // freopen("input.txt", "r", stdin);
    input();
    DFS(1, 1, 0);
    printf("%d\n", L[N][N]);
}

 

BFS

#include <stdio.h>
const int MAX_N = 55;
const int INF = 100;
int N, A[MAX_N][MAX_N], L[MAX_N][MAX_N];
struct Data {
    int x, y, lev;
}que[MAX_N * MAX_N * INF];
int fr, re;


void input(){
    scanf("%d", &N);
    for (int x = 1; x <= N; ++x) {
        for (int y = 1; y <= N; ++y) {
            scanf("%1d", A[x] + y);
            A[x][y] = !A[x][y];
            L[x][y] = INF;
        }
    }
}

void push(int nextX, int nextY, int nl) {
    if (L[nextX][nextY] <= nl + A[nextX][nextY]) return;
    L[nextX][nextY] = nl + A[nextX][nextY];
    que[re++] = { nextX, nextY, L[nextX][nextY] };
}

int BFS() {
    Data cur;
    push(1, 1, 0);

    while (fr < re) {
        cur = que[fr++];
        for (int i = 0; i < 4; ++i) {
            push(cur.x + "0211"[i] - '1', cur.y + "1102"[i] - '1', cur.lev);
        }
    }

    return L[N][N];
}

int main() {
    // freopen("input.txt", "r", stdin);
    input();
    printf("%d\n", BFS());
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 2463 비용  (0) 2021.04.03
[BOJ] 백준 2529 부등호  (0) 2021.04.01
[BOJ] 백준 14867 물통  (0) 2021.03.30
[BOJ] 백준 17616 등수 찾기  (0) 2021.03.13
[BOJ] 백준 1654 랜선 자르기  (0) 2021.03.06

댓글