일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스티커 C++
- 문자열
- horner
- 너비우선탐색
- 백준
- horner algorithm
- 이분탐색
- 입출력
- 코딩테스트
- 프로그래머스C#
- BFS
- 철자검사
- dp
- 알고리즘
- 백준 9465
- 프로그래머스
- 확률
- 확률론
- 9095 C++
- C#
- 통계
- 수치해석
- 통계학
- C
- 프로그래머스 c#
- 파라메트릭 서치
- 선형대수학
- C++
- cpp
- 백준 C#
- Today
- Total
HOIT_B
[ 백준 C++ ] 7576번 토마토 (BFS) 본문
문제
https://www.acmicpc.net/problem/7576
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
코드 다 만들었는데 제출 누르고 날아가서 의욕을 잃었다. 따라서 이번엔 코드가 없다.
며칠이 지나야 토마토가 다 익는지 구하는 문제
익은 토마토와 인접한 토마토는 하루가 지나면 익는다.
(인접 : 상하좌우)
2 <= M 가로 N 세로 <= 1000
1 : 익은토마토 , 0: 익지않은 토마토 , -1 빈칸
1) 익은 토마토를 찾는다.
2) 익은 토마토의 주변 토마토를 큐에 넣는다.
3) 다음 반복 때 DAY +1 해준다.
4) 다 돌았는데 익을 수 있는 토마토 없으면 -1 출력
처음엔 이렇게 생각했었는데 예시를 보다보니 익은 토마토가 한개만 있는 것이 아니었다. 그래서 DAY를 어떻게 셀 수 있을까 하다가 아래의 방법을 사용했다. ( 문제를 충분히 보고 생각을 하자 )
처음 탐색할때 1인 곳의 위치를 vector<make_pair<int, int>> v 에 넣었다가 bfs에서 큐에 넣어줬다. ( 바로 큐에 넣었어도 괜찮았을것같다. )
주변에 있는 익지않은 토마토 map[a][b] = 0 을 이전에 있던 값 +1 해줬다.
6 4
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1
이 예시를 보면
1 -1 0 0 0 0
2 -1 0 0 0 3
3 0 0 0 -1 2
0 0 0 0 -1 1
이런식으로 만들었다.
bfs() 를 돌고 나서 맵을 다시 이중 for 문을 돌면서 확인 한다.
그 때 0이 있으면 -1 을 출력한다. ( 모든 토마토가 익지 않았기때문)
day(변수)보다 더 큰 값이 들어있으면 day 값을 그 값으로 바꿔준다.
day-1 출력하면 끗 -!
'작고소중한 알고리즘 풀기' 카테고리의 다른 글
[ 백준 C++ ]10844번 쉬운 계단 수 (0) | 2024.01.27 |
---|---|
[ 백준 C++ ] 백준 9095번 1, 2, 3 더하기 (0) | 2024.01.20 |
[ 백준 C++ ] 2606 바이러스 (BFS) (0) | 2023.11.26 |
[ 백준 C++ ] 2805번 나무자르기 ( 파라메트릭 서치 ) (0) | 2023.11.25 |
[ 백준 C++ ] 1654번 랜선 자르기 (파라메트릭 서치) (0) | 2023.11.25 |