-
[백준/BOJ] 7576번 토마토 (C++)알고리즘 문제풀이/백준 2021. 1. 13. 18:29
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
BFS 유형의 문제입니다.
토마토가 있는 위치를 벡터에 담아서 큐에 넣어줬습니다. 큐가 진행되면서 visit 배열에 최소 일수가 기록됩니다. 예외처리만 제대로 해준다면 어렵지 않은 문제였습니다.
#include <iostream> #include <vector> #include <queue> #include <cstring> using namespace std; int m, n; int map[1001][1001]; int visit[1001][1001]; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; vector<pair<int, int > > v; int BFS() { queue<pair<int, int > > q; for(int i = 0; i < v.size(); i++) { q.push(v[i]); visit[v[i].first][v[i].second] = 0; } while(!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop(); for(int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if(nx >= 0 && nx < n && ny >= 0 && ny < m) { if(visit[nx][ny] == -1 && map[nx][ny] == 0) { q.push( {nx, ny} ); visit[nx][ny] = visit[x][y] + 1; } } } } int maxx = 0; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(map[i][j] == 0 && visit[i][j] == -1) return -1; maxx = max(maxx, visit[i][j]); } } return maxx; } int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); cin >> m >> n; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { cin >> map[i][j]; if(map[i][j] == 1) { v.push_back( {i, j} ); } } } memset(visit, -1, sizeof(visit)); cout << BFS(); }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 16940번 BFS 스페셜 저지 (0) 2021.01.14 [백준/BOJ] 4179번 불! (C++) (0) 2021.01.13 [백준/BOJ] 2251번 물통 (C++) (0) 2021.01.13 [백준/BOJ] 16947번 서울 지하철 2호선 (C++) (0) 2021.01.12 [백준/BOJ] 16929번 Two Dots (0) 2021.01.11