BOJ 7576 토마토 c++

Algorithm / / 2020. 7. 10. 02:26

백준 7576 토마토 문제

 

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

 

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

 

토마토가 배치된 맵을 담을 board 2차원 배열을 선언하고,

또 거리를 나타낼 dist 2차원 배열을 선언한다.


main함수에서는 먼저 board에 값을 채워넣는다. 안 익은 토마토만 넣고, 익은 토마토는 큐에 넣는다.

 

while Q가 비지 않을 때까지 반복하는데,

cur에는 Q의 맨 첫 번째 pair를 담는다.

 

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

그 상하좌우 좌표에 대해 범위를 벗어난 경우와 이미 방문한 경우는 모두 continue 해버리고,

그렇지 않은 경우에 대해 dist[nx][ny]에 현재좌표, 즉 dist[cur.X][cur.Y] + 1을 해준다.

 

마지막으로 dist배열에 -1이 남아있는 경우, 즉 익지 않은 토마토가 남아 있는 경우 -1을 출력하고,

그런 경우가 없을 때에는 dist배열 중 가장 큰 값이 들어있는 칸의 값을 출력한다.

#include <bits/stdc++.h>
using namespace std;
# define X first
# define Y second
int n;
int m;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int board[1002][1002];
int dist[1002][1002];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n;
    queue<pair<int, int>> Q;
    /*board에 채워넣기*/
    int i, j;
    for (i = 0; i < n; i++){
        for (j = 0; j < m; j++){
            cin >> board[i][j];
            if (board[i][j] == 1)
                Q.push({i, j});
            if (board[i][j] == 0)
                dist[i][j] = -1; 
        }
    }
    int nx;
    int ny;
    while (!Q.empty()) {
        auto cur = Q.front();
        Q.pop();
        for (int dir = 0; dir < 4; dir++) {
            nx = cur.X + dx[dir];
            ny = cur.Y + dy[dir];
            if (nx < 0 || ny < 0 || nx >= n || ny >= m)
                continue;
            if (dist[nx][ny] >= 0)
                continue;
            dist[nx][ny] = dist[cur.X][cur.Y] + 1;
            Q.push({nx, ny});
        }
    }
    int ans = 0;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            if (dist[i][j] == -1) {
                cout << -1;
                return 0;
            }
            ans = max(dist[i][j], ans);
        }
    }
    cout << ans;
}   

'Algorithm' 카테고리의 다른 글

BOJ 1697 숨바꼭질 c++  (0) 2020.07.10
BOJ 4179 불! c++  (0) 2020.07.10
BOJ 2178 미로 탐색 c++  (0) 2020.07.10
BOJ 1926 그림 c++  (0) 2020.07.10
BOJ 10866 덱 (C++)  (0) 2020.07.06
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom