Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 다이나믹프로그래밍
- QUICKSTARTGUIDE
- deque
- COSPROJAVA1급
- PS
- 구현
- 취득후기
- 재귀함수
- spring
- 세그먼트트리
- 백준
- 알고리즘
- DFS
- java
- 우선순위큐
- GatherTown
- 시뮬레이션
- 자바PS
- dp
- COSPRO
- 01BFS
- 게더타운시작
- BFS
- 완전탐색
- 백준코딩테스트
- 네트워크플로우
- YBMCOS
- 다익스트라
- 이젠 골드구현도 어렵네..
- 엘라스틱서치
Archives
- Today
- Total
공부공간
BOJ - 7576 ) 토마토 본문
https://www.acmicpc.net/problem/7576
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 상자에 담긴 토마토의 정보가 주어진다. 하나의 줄에는 상자 가로줄에 들어있는 토마토의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마
www.acmicpc.net
익은토마토가 주변에 안익은 토마토를 전파하면서 퍼지는 문제이다.
퍼질때에 값이 일정하게 ( 시간이 + 1 ) 씩 증가하므로
BFS로 퍼지는 최대시간을 구해준다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
int dir[][] = {{1,0},{-1,0},{0,1},{0,-1}};
int answer =0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
int map[][] = new int[n][m];
ArrayDeque<int []> dq = new ArrayDeque<>();
// 0 번째는 y 좌표 1번째는 x 좌표 2번째는 날짜
for (int y = 0 ; y<n ;y++) {
st = new StringTokenizer(br.readLine());
for(int x= 0 ; x < m ; x++) {
map[y][x] = Integer.parseInt(st.nextToken());
if(map[y][x]==1) dq.add(new int[] {y,x,0});
// 1이면 시작점이기 때문에 큐에 넣어준다.
}
}
while(!dq.isEmpty()) {
int now[] = dq.poll();
int now_y =now[0]; int now_x = now[1]; int time = now[2];
answer = time;
for(int index = 0 ; index < 4 ; index++) {
int next_y = now_y + dir[index][0];
int next_x = now_x + dir[index][1];
if(next_y >=0 && next_x >= 0 && next_y < n && next_x <m) {
if(map[next_y][next_x]==0) {
// 다음 장소가 익지않은 토마토라면, 1로 변경한후에 시간을 늘리고 큐에 넣어준다.
map[next_y][next_x]=1;
dq.add(new int[] {next_y , next_x , time+1});
}
}
}
}
for(int y = 0 ; y < n ; y++) {
for(int x = 0 ; x < m ; x++) {
// BFS가 끝나고 익지않은 토마토가 있다면, -1을 출력한다.
if(map[y][x]==0) answer = -1;
}
}
System.out.println( answer );
}
}
'알고리즘 > 완전탐색(BFS,DFS)' 카테고리의 다른 글
BOJ- 11404 ) 플로이드 (0) | 2020.02.17 |
---|---|
BOJ - 17471 ) 게리맨더링 (0) | 2020.02.17 |
BOJ - 2146 ) 다리만들기 (0) | 2020.02.13 |
BOJ - 17406 ) 배열돌리기4 (0) | 2020.02.11 |
SWEA ) 벽돌깨기 (0) | 2020.02.09 |
Comments