백준 2178번 미로 탐색 문제

 

먼저 X, Y는 pair<int, int>를 위해 define 한다.

board는 string배열이기 때문에 실제로는 char 형태 2차원 배열이다.

(string이 char * 의 역할을 하므로.)

dx[n] + dy[n] 는 항상 상, 하, 좌, 우 중 하나를 나타낸다.

 

Q에 하나씩 넣으면서 dist[0][0]으로부터 목표지점까지 걸리는 시간을 잰다.

nx, ny는 현재 위치의 상, 하, 좌, 우를 반영한 값이다.

 

이 때 범위가 밖으로 벗어나는 경우 continue 해주고,

dist[nx][ny]가 이미 방문한 적이 있는 경우, 즉 `>=0` 인 경우 혹은 board[nx][ny]가 '1'이 아닌 경우

continue 시켜준다.

 

Q가 빌때까지 이를 반복해주면 

dist[row-1][col-1] 에는 dist[0][0]부터 해당 지점까지 걸린 시간이 담긴다.

이것을 출력하면 끝.

#include <bits/stdc++.h>
using namespace std;
# define X first
# define Y second

int row;
int col;
string board[102];
int dist[102][102];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> row >> col;
    for (int i = 0 ; i < row; i++) 
        cin >> board[i];
    for (int i = 0; i < row; i++)
        fill(dist[i], dist[i] + col, -1);
    queue<pair<int, int>> Q;
    dist[0][0] += 1;
    Q.push({0, 0});
    while (!Q.empty()) {
        auto cur = Q.front();
        Q.pop();
        for (int dir = 0; dir < 4; dir++) {
            int nx = cur.X + dx[dir];
            int ny = cur.Y + dy[dir];
            if (nx < 0 || ny < 0 || nx >= row || ny >= col)
                continue;
            if (dist[nx][ny] >= 0 || board[nx][ny] != '1')
                continue;
            dist[nx][ny] = dist[cur.X][cur.Y] + 1;
            Q.push({nx, ny});
        }
    }
    cout << dist[row-1][col-1] + 1;
}

'Algorithm' 카테고리의 다른 글

BOJ 4179 불! c++  (0) 2020.07.10
BOJ 7576 토마토 c++  (0) 2020.07.10
BOJ 1926 그림 c++  (0) 2020.07.10
BOJ 10866 덱 (C++)  (0) 2020.07.06
BOJ 10845 큐 C++  (0) 2020.07.06
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom