반응형
https://www.acmicpc.net/problem/7576
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
[ 문제풀이 ]
bfs를 활용하여 문제를 풀었습니다.
1. 각 칸의 입력을 받으면서 값이 1이라면 queue에 넣습니다.
2. bfs를 돌리면서 cnt의 최댓값을 ans에 저장합니다.
3. arr배열에 있는 토마토 중 익지 않은 토마토가 하나라도 있다면 -1을 출력하고 아니라면 ans를 출력합니다.
[ 소스 코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include<iostream> #include<queue> using namespace std; int N, M; int arr[1000][1000]; int dy[4] = { -1,1,0,0 }; int dx[4] = {0, 0, -1, 1}; struct node { int y; int x; int cnt; }; int main() { scanf("%d %d", &M, &N); queue<node> q; int ans = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { scanf("%d", &arr[i][j]); if (arr[i][j] == 1) { q.push({ i,j,0 }); } } } while (!q.empty()) { int y = q.front().y; int x = q.front().x; int cnt = q.front().cnt; q.pop(); ans = max(ans, cnt); for (int i = 0; i < 4; i++) { int yy = y + dy[i]; int xx = x + dx[i]; if (yy >= 0 && yy < N && xx >= 0 && xx < M) { if (arr[yy][xx] == 0) { //익지 않은 토마토가 있다면 arr[yy][xx] = 1; q.push({ yy,xx,cnt + 1 }); } } } } for (int i = 0; i < N; i++) { //안 익은 토마토가 하나라도 있으면 for (int j = 0; j < M; j++) { if (arr[i][j] == 0) { printf("-1"); return 0; } } } printf("%d", ans); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 14499번 - 주사위 굴리기 (C++) (0) | 2022.08.16 |
---|---|
[ 백준 ] 3190번 - 뱀 (C++) (0) | 2022.08.15 |
[ 백준 ] 16928번 - 뱀과 사다리 게임 (C++) (0) | 2022.08.13 |
[ 백준 ] 9465번 - 스티커 (C++) (0) | 2022.08.12 |
[ 백준 ] 1932번 - 정수 삼각형 (C++) (0) | 2022.08.11 |