개발자 김수진

[백준] 2178. 미로탐색 본문

알고리즘/백준

[백준] 2178. 미로탐색

김수진장 2020. 11. 30. 16:36

[문제]

 

www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

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

www.acmicpc.net

 

[풀이]

 

미로의 정보가 입력으로 주어지고 시작점 (1,1)에서 도착점(N,M)까지의 최단거리를 구하는 문제이다.

1은 이동할 수 있는 칸을 의미하고, 0은 이동할 수 없는 칸을 의미한다. 

 

BFS를 사용해 풀었다. 다음 위치의 값이 1인 경우에만 좌표를 queue에 저장하였고, 이미 방문했던 곳이라면 queue에 담지 않았다.

실수했던 부분이 BFS는 동시에 움직이므로 최단거리를 구하는 경우 재방문 하지 않아도 된다.

 

[코드]

 

시간 : 0ms

#include <iostream>
#include <queue>
#define MAX 100

using namespace std;

int visited[MAX][MAX]={0,};
int map[MAX][MAX]={0,};
int N,M;

int dx[4]= {-1,1,0,0};
int dy[4] = {0,0,1,-1};

struct pos{
    int x,y;
};

int BFS()
{
    queue <pos> q;
    
    q.push({0,0});
    visited[0][0]=1;
    
    while(!q.empty()){
        
        int x= q.front().x;
        int y= q.front().y;
        if(x==N-1 && y==M-1)    break;
        q.pop();
        
        for(int i=0;i<4;i++){
            
            int nx = x+dx[i];
            int ny = y+dy[i];
            
            if(nx <0 || ny<0 || nx >= N || ny >= M || map[nx][ny]==0)    continue;
            if(visited[nx][ny]!= 0 )   continue;
            
            visited[nx][ny] = visited[x][y]+1;
            q.push({nx,ny});
        }
    }
    
    return visited[N-1][M-1];
}

int main(void)
{
    cin >> N >> M;
    
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            scanf("%1d",&map[i][j]);
        }
    }
    
    cout << BFS();
    
    return 0;
    
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 10844. 쉬운 계단 수  (0) 2020.12.07
[백준] 3055. 탈출  (0) 2020.12.03
[백준] 2066. 바이러스  (0) 2020.11.30
[백준] 2206. 벽 부수고 이동하기  (0) 2020.10.30
[백준]2193. 이친수  (0) 2020.10.29