반응형
문제 링크 : https://www.acmicpc.net/problem/7576
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토�
www.acmicpc.net
>풀이
BFS를 사용합시다! x좌표, y좌표, 탐색 횟수 cnt.
#include <bits/stdc++.h>
using namespace std;
typedef struct types {
int x;
int y;
int cnt;
}types;
bool visited[1001][1001];
int box[1001][1001];
int moveX[4] = {1, 0, -1, 0};
int moveY[4] = {0, 1, 0, -1};
int M, N; //가로, 세로
queue<types> bfs;
int
main(void)
{
int cnt = 0;
scanf("%d %d", &M, &N);
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++) {
scanf("%d", &box[i][j]);
if (box[i][j] == 1) {
bfs.push({i, j, 0});
visited[i][j] = true;
}
else if (box[i][j] == -1)
visited[i][j] = true;
}
if (bfs.empty()) {
printf("-1");
return 0;
}
while (!bfs.empty()) {
auto a = bfs.front();
bfs.pop();
cnt = max(cnt, a.cnt);
for (int i = 0; i < 4; i++) {
int nx = a.x + moveX[i];
int ny = a.y + moveY[i];
if (nx >= 0 && ny >=0 && nx < N && ny < M && !visited[nx][ny] && box[nx][ny] != -1) {
bfs.push({nx, ny, a.cnt + 1});
visited[nx][ny] = true;
}
}
}
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (!visited[i][j]) {
printf("-1");
return 0;
}
printf("%d", cnt);
return 0;
}
(개발 환경 : vs code)
반응형
'알고리즘 (백준) > BOJ 길라잡이 (1)' 카테고리의 다른 글
백준 2636 (치즈) / C++ (0) | 2020.10.14 |
---|---|
백준 7569 (토마토) / C++ (1) | 2020.10.07 |
백준 2206 (벽 부수고 이동하기) / C++ (0) | 2020.08.25 |
백준 1149 (RGB거리) / C++ (0) | 2020.08.24 |
백준 1932 (정수 삼각형) / C++ (0) | 2020.07.30 |