반응형
[광고 누르면 오늘의 행운 상승!!]
BFS 기본문제
1. 참고사항
치즈가 구멍이 뚫려있을 수 있기 때문에 X가 있는 지점 즉, 테두리에서 BFS를 시작한다.
2. 구현
- 맵을 받으면서 치즈의 갯수를 센다
- 치즈가 남아있다면 테두리부터 BFS를 시작하면서 time을 증가시킨다
- 0이라면 전진하고(q에 add) 1이라면 0으로 바꾸고 cnt를 증가시키고 (치즈 개수)
VISIT을 True로 바꾸어 준다(q에는 추가하지 않고 방문처리만 한다)
- bfs가 끝나면 한타임이 흐른 것이므로 치즈가 남아있는지 센다
- 치즈가 남아있다면 반복
- 치즈가 없다면 time과 cnt를 출력한다.
package Study8;
import java.io.*;
import java.util.*;
public class 치즈 {
static class Air{
int row, col, cnt;
public Air(int row, int col, int cnt) {
this.row = row;
this.col = col;
this.cnt = cnt;
}
}
static int dx[] = {-1,0,1,0};
static int dy[] = {0,1,0,-1};
static int[][] map;
static boolean[][] visit;
static int R,C,N,ans,cnt;
static int cheese, time;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("test.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
map = new int[R][C];
for (int i = 0; i < R; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < C; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] == 1) cheese++;
}
}
while(cheese > 0) {
visit = new boolean[R][C];
time++;
cnt = 0;
for (int j = 0; j < C; j++) {
if(!visit[0][j] && map[0][j] == 0) {
bfs(0,j);
}
if(!visit[R-1][j] && map[R-1][j] == 0) {
bfs(R-1,j);
}
}
for (int j = 0; j < R; j++) {
if(!visit[j][0] && map[j][0] == 0) {
bfs(j,0);
}
if(!visit[j][C-1] && map[j][C-1] == 0) {
bfs(j,C-1);
}
}
}
System.out.println(time);
System.out.println(cnt);
}
private static void bfs(int row, int col) {
Queue<Air> q = new LinkedList<>();
visit[row][col] = true;
q.add(new Air(row,col,0));
while(!q.isEmpty()) {
Air air = q.poll();
for (int dir = 0; dir < 4; dir++) {
int nx = air.row + dx[dir];
int ny = air.col + dy[dir];
if(nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
if(visit[nx][ny]) continue;
visit[nx][ny] = true;
if(map[nx][ny] == 1) {
map[nx][ny] = 0;
cheese--;
cnt++;
continue;
}
else
q.add(new Air(nx,ny,air.cnt+1));
}
}
}
}
반응형
'2. 알고리즘사이트 > 1. 백준' 카테고리의 다른 글
행성터널 [백준 2887][JAVA][골드 2][MST][Comparator] (0) | 2020.05.16 |
---|---|
탈출 [백준 3055][JAVA][골드 5][BFS] (0) | 2020.05.15 |
복제로봇 [백준 1944][JAVA][골드 2][BFS][MST][Prim] (0) | 2020.05.15 |
성곽 [백준 2234][JAVA][골드 4][비트마스킹][BFS] (0) | 2020.05.15 |
가스관 [백준 2931][JAVA][골드 3][DFS] (0) | 2020.05.15 |