https://www.acmicpc.net/problem/2636
2636번: 치즈
아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓
www.acmicpc.net
쉽네요 자바로 풀었습니다.
import java.util.*;
import java.lang.*;
import java.lang.reflect.Array;
import java.io.*;
public class Main {
private int i;
private int j;
public Main() {
}
public Main(int i, int j) {
this.i=i;
this.j=j;
}
public int I() {
return this.i;
}
public int J() {
return this.j;
}
public void I(int i) {
this.i=i;
}
public void J(int j) {
this.j=j;
}
public static void Prints(boolean [][]bCheck,int n,int m) {
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
int myindex=bCheck[i][j] ? 1 : 0;
System.out.print(myindex);
}
System.out.println();
}
}
public static void main(String[] args) throws Exception {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int [][]maps=new int[n][m];
int [][]copymaps=new int[n][m];
boolean [][]bVisisted=new boolean[n][m];
boolean [][]copybVisisted=new boolean[n][m];
Queue<Main> q=new LinkedList<>();
int initcnt=0;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
int tmp=scan.nextInt();
maps[i][j]=tmp;
copymaps[i][j]=tmp;
if(tmp==1) {
bVisisted[i][j]=true;
copybVisisted[i][j]=true;
initcnt++;
}else {
bVisisted[i][j]=false;
copybVisisted[i][j]=false;
}
}
}
int diri[]= {1,-1,0,0};
int dirj[]= {0,0,1,-1};
int mins=n*m;
int tcnt=0;
while(true) {
q.add(new Main(0,0));
boolean binit=false;
while(!q.isEmpty()) {
Main start=q.peek();
q.poll();
for(int i=0;i<4;i++) {
int tmpDiri=start.I() +diri[i];
int tmpDirj=start.J() +dirj[i];
if(tmpDiri==-1||tmpDirj==-1||tmpDiri>=n||tmpDirj>=m) {
continue;
}
if(bVisisted[tmpDiri][tmpDirj]==true) {
if(maps[tmpDiri][tmpDirj]==1) {
copymaps[tmpDiri][tmpDirj]=0;
copybVisisted[tmpDiri][tmpDirj]=false;
binit=true;
}
continue;
}
bVisisted[tmpDiri][tmpDirj]=true;
q.add(new Main(tmpDiri,tmpDirj));
}
}
int gcnt=0;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
bVisisted[i][j]=copybVisisted[i][j];
maps[i][j]=copymaps[i][j];
if(maps[i][j]==1) {
gcnt++;
}
}
}
if(binit==true) {
tcnt++;
}
if(gcnt!=0) {
mins=Math.min(gcnt, mins);
}else {
if(tcnt==1) {
mins=initcnt;
}
break;
}
}
System.out.println(tcnt);
System.out.println(mins);
}
}
'알고리즘 공부' 카테고리의 다른 글
백준 상어 초등학교 (2) | 2023.11.23 |
---|---|
백준 가장 큰 정사각형 (0) | 2023.11.21 |
백준 주사위 (복습) (1) | 2023.11.21 |
백준 배 (복습) (0) | 2023.11.20 |
백준 트리(복습) (1) | 2023.11.20 |