알고리즘 모음(C++)

백준 2178 - 미로 탐색(C++) 본문

백준

백준 2178 - 미로 탐색(C++)

공대생의 잡다한 사전 2021. 7. 31. 00:34

문제 링크입니다 https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

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

www.acmicpc.net

BFS 문제였습니다

문제 조건
출력 예시

 

 

문제 접근 방법

1. 미로를 입력 받는다.

2. (1,1) 부터 (N,M) 까지 BFS를 통해서 최소 거리를 탐색한다.

 

 

문제 접근 방법 - 2번

void bfs(int a, int b){
    q.push({a,b});
    while(!q.empty()){
        int x1 = q.front().x;
        int y1 = q.front().y;
        q.pop();
        for(int i = 0; i < 4; i++){
            int xx = x1 + arr[i];
            int yy = y1 + arr2[i];
            if(xx >= 1 && yy >= 1 && xx <= num && yy <= num2){
                if(check[xx][yy] == 0 && miro[xx][yy] == '1'){
                    check[xx][yy] = check[x1][y1] + 1;
                    q.push({xx,yy});
                }
            }
        }
    }
}

4방향 탐색을 통해서 좌표 범위에 맞으면서, 이전에 방문하지 않았으며, 길이 존재할 경우, 큐에 넣어주면서 탐색을 이어줍니다.

check[] 배열에 이동한 횟수를 저장했습니다!!

 

 

 

자세한 것은 코드를 참고해주세요!

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <cstring>
#include <cmath>
using namespace std;

int num, num2;
char miro[101][101];
int check[101][101];
typedef struct qu{
    int x;
    int y;
}qu;
queue<qu> q;
int arr[4] = {1,-1,0,0};
int arr2[4] = {0,0,1,-1};

void bfs(int a, int b){
    q.push({a,b});
    while(!q.empty()){
        int x1 = q.front().x;
        int y1 = q.front().y;
        q.pop();
        for(int i = 0; i < 4; i++){
            int xx = x1 + arr[i];
            int yy = y1 + arr2[i];
            if(xx >= 1 && yy >= 1 && xx <= num && yy <= num2){
                if(check[xx][yy] == 0 && miro[xx][yy] == '1'){
                    check[xx][yy] = check[x1][y1] + 1;
                    q.push({xx,yy});
                }
            }
        }
    }
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    cin >> num >> num2;
    for(int i = 1; i<= num; i++){
        for(int j = 1; j <= num2; j++){
            cin >> miro[i][j];
        }
    }
    for(int i = 1; i <= num; i++){
        for(int j = 1; j <= num2; j++){
            if(check[i][j] == 0 && miro[i][j] == '1'){
                check[i][j] = 1;
                bfs(i,j);
            }
        }
    }
    cout << check[num][num2];
    return 0;
}

 

 

질문 및 조언 댓글 남겨주세요!

'백준' 카테고리의 다른 글

백준 1707 - 이분 그래프(C++)  (0) 2021.08.02
백준 14500 - 테트로미노(C++)  (0) 2021.08.02
백준 1600 - 말이 되고픈 원숭이(C++)  (0) 2021.07.30
백준 1012 - 유기농 배추(C++)  (0) 2021.07.30
백준 2606 - 바이러스(C++)  (0) 2021.07.30