[백준] 14502번 연구소 (bfs, 구현)
728x90
반응형
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
class Pos{ //좌표값을 가지는 클래스
int y; int x;
public Pos(int y, int x) {
super();
this.y = y;
this.x = x;
}
}
public class Main {
static int n,m;
static int[][] map;
static List<Pos> list=new ArrayList<Pos>();
static boolean vis[]; //벽을 세운 곳
static boolean check[][];//copy배열 방문 여부 체크
static int[] ypos= {0,0,1,-1};
static int[] xpos= {1,-1,0,0};
static int answer;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
map=new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
map[i][j]=sc.nextInt();
if(map[i][j]==0)list.add(new Pos(i,j));//0의 좌표=벽세우는곳
}
}
vis=new boolean[list.size()];
comb(0,0);
System.out.println(answer);
}
private static void comb(int cnt,int start) {
if(cnt==3) {// 세운데 벽 세움 bfs 고
bfs();
return;
}
for (int i = start; i < list.size(); i++) {
if(vis[i])continue;
vis[i]=true;
comb(cnt+1,i+1);
vis[i]=false;
}
}
private static void bfs() {
int[][] copy=copyMap(); //복사한 배열을 받는다.
check=new boolean[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(!check[i][j] && copy[i][j]==2) {// 바이러스 퍼진다아아
Queue<Pos> q=new LinkedList<Pos>();
q.add(new Pos(i,j));
check[i][j]=true;
while(q.size()!=0) {
Pos cur=q.poll();
int y=cur.y;
int x=cur.x;
for (int k = 0; k < 4; k++) {
int yy=y+ypos[k];
int xx=x+xpos[k];
if(xx<0 || yy<0 || xx>=m || yy>=n)continue;
if(check[yy][xx])continue;
if(copy[yy][xx]!=1) {//0이거나 2인 경우
check[yy][xx]=true;
copy[yy][xx]=2;//2로 만들어줌
q.add(new Pos(yy,xx));
}
}
}
}
}
}
int cnt=0;
for (int i = 0; i < n; i++) {// 최종 0의 개수 세기
for (int j = 0; j < m; j++) {
if(copy[i][j]==0)cnt+=1;
}
}
if(cnt>answer)answer=cnt;
}
private static int[][] copyMap() {//이차원 배열 복사해준다.
int temp[][]=new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
temp[i][j]=map[i][j];
}
}
for (int l = 0; l < list.size(); l++) {
if(vis[l]) {//벽인 부분은 1로 만들어준다.
int ty=list.get(l).y;
int tx=list.get(l).x;
temp[ty][tx]=1;
}
}
return temp;
}
}
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 11741번 연구소2 (java, flood fill) (0) | 2021.03.28 |
---|---|
[백준] 17472번 다리만들기2 (java, bfs) (0) | 2021.03.26 |
[백준] 9205번 맥주 마시면서 걸어가기 (java, 플로이드 와샬) (0) | 2021.03.25 |
[백준] 12015번 가장 긴 증가하는 부분 수열2 (JAVA, 이분탐색 binary search) (0) | 2021.03.25 |
[백준] 2636. 치즈 (bfs, java) (0) | 2021.03.24 |
TAGS.