Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
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
Tags
more
Archives
Today
Total
관리 메뉴

devchang

백준 7576(토마토) 풀이 본문

알고리즘

백준 7576(토마토) 풀이

devchang 2024. 9. 24. 13:48

문제

입력

출력

 

해결방법

 

#include <iostream>
#include <queue>

using namespace std;

int main()
{
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, m;
  int a[1000][1000];
  int vis[1000][1000] = {
      0,
  };
  queue<pair<int, int>> q;
  int x[4] = {-1, 0, 1, 0};
  int y[4] = {0, -1, 0, 1};
  int day = 0;

  cin >> m >> n;

  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < m; j++)
    {
      cin >> a[i][j];
      if (a[i][j] == 1)
      {
        q.push({i, j});
      }
    }
  }

  while (!q.empty())
  {
    pair<int, int> tmp = q.front();
    q.pop();
    for (int k = 0; k < 4; k++)
    {
      int tmpx = tmp.first + x[k];
      int tmpy = tmp.second + y[k];
      int cnt = vis[tmp.first][tmp.second];

      if (tmpx < 0 || tmpy < 0 || tmpx > n - 1 || tmpy > m - 1)
      {
        continue;
      }

      if (vis[tmpx][tmpy] <= cnt + 1 && vis[tmpx][tmpy] != 0 || a[tmpx][tmpy] == 1 || a[tmpx][tmpy] == -1)
      {
        continue;
      }

      q.push({tmpx, tmpy});
      vis[tmpx][tmpy] = cnt + 1;
    }
  }

  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < m; j++)
    {
      if (a[i][j] == 0 && vis[i][j] == 0)
      {
        cout << -1;
        return 0;
      }
      if (day < vis[i][j])
      {
        day = vis[i][j];
      }
    }
  }

  cout << day;
}

 

이 문제는 bfs로 해결할 수 있다.

vis배열은 토마토가 몇번째로 익는지 일수를 기록하기 위해 사용할 것이다.

처음으로 입력을 받고 입력을 받을 때 시작점이 될 수 있는 익은 토마토를 입력받으면 큐에 삽입한다.

 

시작점들을 큐에 모두 삽입했으므로 bfs를 실행한다.

이웃된 익은 토마토가 있을 때만 토마토가 익을 수 있기 때문에 익은 토마토에서 시작을 하고

그 주변의 안익은 토마토를 찾아간다.

안익은 토마토를 찾아갈 때 비어있거나 이미 익은 토마토는 피한다.

bfs를 돌릴 때 익은 토마토를 만났을 때는 더 빨리 익을 수 있으면 vis배열의 일수를 더 작은 일수로 교체해준다.

 

이렇게 모두 bfs를 실행한 후 모든 토마토를 확인해

안익은 토마토가 있으면 -1을 출력하고

모든 토마토가 익었으면 가장 늦게 익은 토마토의 일수를 출력한다.

 

 

'알고리즘' 카테고리의 다른 글

백준 10026(적록색약) 풀이  (0) 2024.09.24
백준 7562(나이트의 이동) 풀이  (0) 2024.09.24
백준 4179(불!) 풀이  (0) 2024.09.24
백준 1920번(수 찾기) 풀이  (1) 2024.04.20
알고리즘  (0) 2024.04.20