c++/알고리즘

백준2178번-미로BFS

hojung 2022. 3. 28.
728x90
반응형

이 문제는 가중치가 같은 맵 안에서의 최단 경로를 찾는 문제이다. 이는 자료구조 queue를 사용하며 풀면 되는데 나의 코드는 다음과 같다.

#include <algorithm>
#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
	int n, m, y,x;
	int max = 104;
    int a[104][104];
    int visited[104][104]; // 입력 배열과 방문 배열 
    int dy[4] = {-1,0,1,0};
    int dx[4] = {0,1,0,-1};
int main() {
	cin >> n;
	cin >> m;
    for(int i = 0; i < n; i++){
        for(int j= 0; j < m;j++)
        {
            cin >>a[i][j];
        }
    }//입력 만들기 

    queue<pair<int,int> > q; // q설정
    visited[0][0] = 1;// 방문 정보를 넣는다. 
    q.push({0,0});
    while(q.size()) // q의 사이즈만큼 반복
    {
        tie(y,x) = q.front(); q.pop();
        for(int i =0; i < 4; i++){
            int ny = y + dy[i];
            int nx = x + dx[i];
            if(ny < 0 || ny > n || nx < 0 || nx > m || a[ny][nx] == 0) continue; // 경계조건과 0일 경우
            if(visited[ny][nx]) continue;// 방문을 이미 한 경우
            visited[ny][nx]  = visited[y][x] + 1;
            q.push({ny, nx});

        }
    }
    cout << visited[n-1][m-1] << endl;
    return 0;
}

자 코드를 살펴보겠다. 

우선 우리에게 필요한 정보는 원본의 맵을 담당할 배열, 방문을 체크할 다른 배열, 맵의 크기를 결정할 변수 두 개, 인덱스를 나타낼 변수 두 개, 또한 인접한 영역만 움직일 수 있다고 했으니 index 배열 두 개가 필요하다. 

 

이 문제는 일반적인 BFS문제로써 맵의 입력을 받아준 후 queue 자료형을 생성하고 방문 배열의 시작점을 1로 만들어준다. 

그 후 queue에 시작점을 넣어주면 queue는 FIFO(First In First Out)구조이기 때문에 넣어준 시작점부터 탐색을 하기 시작한다. 그 후 tie함수 (tuple.h안에 존재한다.)를 사용하여 queue의 front를 정의해준 후 pop을 해준다. 그 후 index배열을 통해 x와 y의 새로운 좌표를 구해준 후 그 좌표에 해당하는 방문 배열이 0인지 1인지를 판단한다. 

만약 방문 배열이 0이라면 아직 방문하지 않은 것이니 +1을 해줘 최단 경로의 수로 만들어주고 방금 +|1로 해줬던 배열 인덱스를 다시 queue에 푸쉬해준다. 

 

이 과정에서 boundary처리 같은 경우는 if문 안에서 처리를 해준다. 

 

전형적인 BFS알고리즘으로 요약하면 다음과 같다. 

queue생성

while(q.size()) {}

tie(y,x) = q.front() q.pop()

for(int i=0; i< 4; i++){바운더리 처리 및 조건 처리}

인덱스 배열 계산 

방문 배열 + 1

방금 +1해준 배열 인덱스 다시 queue에 푸쉬

728x90
반응형

'c++ > 알고리즘' 카테고리의 다른 글

백준-2468 안전영역  (8) 2022.03.29
백준-1012번 - 유기농 배추  (0) 2022.03.29
shell sort c++  (0) 2022.03.23
백준 9996  (0) 2022.03.19
백준 1159  (0) 2022.03.18

댓글