[BFS]백준2178번 미로탐색

업데이트:

백준2178번 미로 탐색

_2021-02-27__2 31 56

단순 BFS로 구현할 수 있는 문제였다.

BFS로 경로 탐색을 할 경우 목적지에 도착한 경우는 최단 경로가 보장된다.

편의상 각 칸이 레벨을 가지고 있다고 가정한다.

따라서 처음 출발 위치에서 레벨 1로 시작해서, 한 칸 이동할 때마다 레벨을 이전 칸의 레벨 + 1로 설정한다.

목적지에 도착했을 때는 해당 칸의 레벨을 출력한다.

단순히 몇 번 이동했는지를 출력하면 전체 1의 개수가 되기 때문에 정답이 될 수 없다.

3차원 배열, tuple 혹은 추가 배열을 이용해 각 칸의 레벨을 저장하여 구현할 수 있다.

#include <iostream>
#include <queue>
#include <string>

using namespace std;

int N, M;
int arr[101][101];
int level[101][101];
bool visited[101][101] = {false,};

int x_iter[4] = {1,0,-1,0};
int y_iter[4] = {0,1,0,-1};

int main(){
    cin >> N >> M;
    for(int i=0;i<N;i++){
        string s;
        cin >> s;
        for(int j=0;j<M;j++){
            arr[i][j] = s[j]-'0';
        }
    }
    queue<pair<int,int> > q;
    q.push(make_pair(0,0));
    visited[0][0] = true;
    level[0][0] = 1;
  
    while(!q.empty()){
        pair<int,int> cur = q.front();
        q.pop();
        if(cur.first == N-1 && cur.second == M-1){
            cout << level[cur.first][cur.second];
            break;
        }
        
        for(int i=0;i<4;i++){
            int tmp_y = cur.first + y_iter[i];
            int tmp_x = cur.second + x_iter[i];

            if(tmp_x >= 0 && tmp_x < M && tmp_y >= 0 && tmp_y <N){
                if(!visited[tmp_y][tmp_x] && arr[tmp_y][tmp_x] == 1){
                    q.push(make_pair(tmp_y,tmp_x));
                    level[tmp_y][tmp_x] = level[cur.first][cur.second] + 1;
                    visited[tmp_y][tmp_x] = true;
                }
            }
        }
    }
//    cout << count << "\n";
    
}

카테고리:

업데이트:

댓글남기기