www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

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

www.acmicpc.net

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

int n, m;
char miro[100][100];
bool visited[100][100];

struct Point
{
    int row;
    int col;
};

int main(void)
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(0);

    cin >> n >> m;
    for(int r = 0 ; r < n ; r++)
    {
        for(int c = 0 ; c < m ; c++)
        {
            cin >> miro[r][c];                                  // 미로 정보 입력
            if(miro[r][c] == '0') visited[r][c] = true;         // 길이 아닌 땅을 방문한 곳으로 표시함, 갈 수 없다는 의미
        }
    }
    int answer = 0;                                             // answer 은 최단거리 값이 담길 변수
    queue<pair<Point,int>> q;
    q.push(pair<Point,int>(Point{0, 0}, 1));                    // (0,0) 시작지점부터 길찾기 시작
    while(true)
    {
        pair<Point, int>& cur = q.front();                      // 큐에서 꺼낼 값 (좌표(row,col), 거리)
        Point& pos = cur.first;
        if(pos.row == n - 1 && pos.col == m - 1)                // 만약 이번 좌표가 목적지라면
        {
            answer = cur.second;                                // 이번 거리를 answer 에 넣고 반복 종료
            break;
        }
                                                                // 목적지가 아닐 경우 계속 진행
        visited[pos.row][pos.col] = true;                       // 이번 좌표 방문 처리
        // 상하좌우 4 방향으로 인덱스를 벗어나지 않고 방문하지 않은 길이 있다면 큐에 넣어줌
        if(pos.row - 1 >= 0 && !visited[pos.row - 1][pos.col]) 
            q.push(pair<Point,int>(Point{pos.row-1, pos.col}, cur.second + 1));
        if(pos.row + 1 < n && !visited[pos.row + 1][pos.col]) 
            q.push(pair<Point,int>(Point{pos.row+1, pos.col}, cur.second + 1));
        if(pos.col - 1 >= 0 && !visited[pos.row][pos.col - 1]) 
            q.push(pair<Point,int>(Point{pos.row, pos.col-1}, cur.second + 1));
        if(pos.col + 1 < m && !visited[pos.row][pos.col + 1]) 
            q.push(pair<Point,int>(Point{pos.row, pos.col+1}, cur.second + 1));
        q.pop();
    }

    cout << answer << '\n';
}

 

[Approach]

1. BFS 사용해서 최단 거리를 구하면 될 것 같다. 숨바꼭질 한번 애먹으면서 풀었던 게 도움이 많이 된다!

 

[Point]

1. scanf 같은 경우는 정수더라도 %1d 처럼 하나씩 받을 수 있는데... sync_with_stdio 때문에 같이 사용하지도 못하고!

2. 아예 큐에 pair 로 길이까지 같이 저장 vs 따로 배열을 만들어놓고 저장. 뭐가 더 나으려나

3. DFS 로도 거리를 계산해나가면서 풀 수 있을 것 같다.

'PS > BOJ' 카테고리의 다른 글

[백준] 7569.cpp : 토마토2  (0) 2020.07.08
[백준] 7576.cpp : 토마토  (0) 2020.07.08
[백준] 2667.cpp : 단지번호붙이기  (0) 2020.07.07
[백준] 1992.cpp : 쿼드트리  (0) 2020.07.07
[백준] 1927.cpp : 최소 힙  (0) 2020.07.07

+ Recent posts