ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2178 - 미로탐색 C++
    백준 algorithm 2022. 3. 28. 17:45
    반응형

    문제 설명

     

    입력

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

    출력

    첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착 위치로 이동할 수 있는 경우만 입력으로 주어진다.

    예제 입력 1 복사

    4 6
    101111
    101010
    101011
    111011
    

    예제 출력 1 복사

    15

    예제 입력 2 복사

    4 6
    110110
    110110
    111111
    111101
    

    예제 출력 2 복사

    9
    

    예제 입력 3 복사

    2 25
    1011101110111011101110111
    1110111011101110111011101
    

    예제 출력 3 복사

    38
    

    예제 입력 4 복사

    7 7
    1011111
    1110001
    1000001
    1000001
    1000001
    1000001
    1111111
    

    예제 출력 4 복사

    13

     

     

    => BFS를 이용해서 풀 수 있는 문제였습니다. 

    => 저는 시작점을 세지 않았기 때문에 맨마지막에 1을 더해서 출력하였습니다. 

    => 현재위치에서 갈 수 있는 위치에 대한 Validation과정에서 시간을 많이 소요하였습니다. 

    => nx는 N 미만이고 , ny는 M 미만입니다. 

    => 풀이과정은 아래에 이미지로 첨부하였습니다. 

     

    문제풀이

     

     

    
    
    #include <string>
    #include <algorithm>
    #include <set>
    #include <map>
    #include <unordered_map>
    #include <unordered_set>
    #include <iostream>
    #include <queue>
    #include <utility>
    
    using namespace std;
    
    int N,M; //초기변수값 N*M
    string mp[100]; //주어진 미로를 저장할 map
    int dis[100][100]; //최소거리를 저장할 변수, <0,0>에서 <0,1>을 가면 <0,1>에는 1이 저장된다.
    int dx[4] = {0,1,0,-1};//인접한 곳만 갈 수 있도록 하는 변수
    int dy[4] = {1,0,-1,0};
    queue<pair<int, int>> quePair;
    
    void BFS(int x, int y)
    {
        quePair.push(make_pair(x,y));
        
        int tmpX, tmpY;
        while(!quePair.empty())
        {
            tmpX=quePair.front().first;
            tmpY=quePair.front().second;
            quePair.pop();
            
            for(int i=0; i<4; i++)
            {
                int nx = tmpX + dx[i];
                int ny = tmpY + dy[i];
                if( (nx >= 0) && (nx < N) && (ny >= 0) && (ny < M) && (mp[nx][ny] == '1') && (dis[nx][ny] == 0) ) //map은 string이니까 소괄호 해주고, dis는 int니까 필요없다.
                {
                    quePair.push(make_pair(nx,ny));
                    dis[nx][ny]=dis[tmpX][tmpY]+1;
                }
                
            }
            
        }
        
    }
    
    int main()
    {
        
        cin >> N >> M;
        for(int i=0; i<N; i++)
        {
            cin >>mp[i];
        }
        BFS(0,0);
        
        cout <<dis[N-1][M-1]+1;
        return 0;
    }
    반응형

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

    백준 2606 바이러스 C++  (0) 2022.03.31
    백준 7576 - 토마토 C++  (0) 2022.03.29
    백준 2003 수들의 합 2 C++  (0) 2021.11.02
    백준 1806 - 부분합  (0) 2021.11.01
    백준 10757 - 큰수찾기  (0) 2021.06.30

    댓글

Designed by Who.