백준 2636 치즈
2020. 5. 15. 21:28ㆍ프로그래밍 대회
import java.util.*;
import java.io.*;
public class Main {
static int [][] dirs = { {-1,0},{1,0},{0,1},{0,-1}};
static int N,M;
static int [][] map;
static boolean[][] v;
public static void main(String[] args) throws IOException {
BufferedReader br;
br = new BufferedReader(new InputStreamReader(System.in));
// br = new BufferedReader(new StringReader(src));
StringTokenizer st = new StringTokenizer(br.readLine());
N= Integer.parseInt(st.nextToken());
M= Integer.parseInt(st.nextToken());
map=new int[N][M];
v=new boolean[N][M];
int oneCnt=0;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j]= Integer.parseInt(st.nextToken());
if(map[i][j]==1) {
oneCnt++;
}
}
}
int beforeCnt=0;
int time=0;
while(oneCnt>0) {
for (int i = 0; i < v.length; i++) {
Arrays.fill(v[i], false);// 이전 공기도 false로 바꾼다
}
bfs(); //공기 칠하기 공기는 true;
//공기중에 인접한 치즈 고르기 v : true
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(v[i][j]) continue;
if(map[i][j]==0) continue;
for (int d = 0; d < dirs.length; d++) {
int x =i+dirs[d][0];
int y =j+dirs[d][1];
if(map[x][y]==0 && v[x][y]) { //인접한 면중 공기가 있다!
v[i][j]=true; //없앨 것이다.
break; // 사방탐색 관둠 없앨꺼임.
}
}
}
}
//치즈를 없애자
beforeCnt =oneCnt;// 없애기 이전의 치즈 갯수
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(map[i][j]==1 && v[i][j]) {
map[i][j]=0; //치즈 없앰
oneCnt--; //생존 치즈갯수 감소
}
}
}
time++;
}//while
System.out.println(time+"\n"+beforeCnt);
}// main
private static void bfs() {
Queue<Loc> q= new LinkedList<>();
q.offer(new Loc(0,0));
while(!q.isEmpty()) {
Loc air = q.poll();
v[air.x][air.y]=true; // 공기는 true
for (int d = 0; d < dirs.length; d++) {
int x =air.x +dirs[d][0];
int y =air.y +dirs[d][1];
if(!isIn(x,y)) continue;
if(v[x][y]) continue;
if(map[x][y]==1) continue;
v[x][y]=true;
q.offer(new Loc(x,y));
}
}
}
private static boolean isIn(int x, int y) {
return 0<=x && x<N && 0<=y && y<M ;
}
static class Loc{
int x,y;
public Loc(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
}//class
'프로그래밍 대회' 카테고리의 다른 글
백준 괄호 9093 java (0) | 2022.03.17 |
---|---|
1757 달려달려 (java) (0) | 2020.08.05 |
SWEA 모의역량테스트 탈주범 검거 (0) | 2020.06.02 |
2630 색종이 만들기 (0) | 2020.02.25 |
2178 미로탐색 (0) | 2020.02.25 |