알고리즘/문제 풀이

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

qqlzzb 2022. 6. 20. 21:04

문제 https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

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

www.acmicpc.net

풀이

최단 거리를 구해야 하므로 BFS를 이용한다. BFS는 시작 노드에서 가까운 노드를 먼저 방문하기 때문에 BFS로 탐색하다가 먼저 찾아지는 답이 최단거리가 되기 때문이다. 

 

코드

#include <iostream>
#include <queue>
using namespace std;

int n,m;
bool visited[100][100]; //방문여부
int map[100][100]; //미로
int cnt[100][100]; //경로 세기

int dx[4] = {1, 0, -1, 0}; //방향 설정
int dy[4] = {0, 1, 0, -1};

void bfs(int x, int y)
{
    visited[x][y]=true;
    queue<pair<int,int>> q;
    q.push(make_pair(x,y));

    while(!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for(int i=0; i<4; i++)
        {
            int rx = x+dx[i];
            int ry = y+dy[i];
            if(rx>=n || rx<0 || ry>=m || ry<0) continue;

            if(!visited[rx][ry]&&map[rx][ry]==1)
            {
                cnt[rx][ry]=cnt[x][y]+1;
                visited[rx][ry]=true;
                q.push(make_pair(rx,ry));
            }
        }
    }
}

int main()
{
    cin>>n>>m;
    char s[100];
    for(int i=0; i<n; i++)
    {
        scanf("%s",s);
        for(int j=0; j<m; j++)
        {
            int a = s[j]-'0';
            map[i][j]=a;
        }
    }

    bfs(0,0);
    cout<<cnt[n-1][m-1]+1;
}