치즈(2636)
https://www.acmicpc.net/problem/2636
감도 안왔다... 여기까지가 한계인건가....
그래도 구글링해서 풀어보다보니까 그—-래도 감은 온다 내일 시험이니까 일단은 흐름파악했다는걸로 만족하자
import java.util.*;
import java.io.*;
public class Main{
static int n, m;
static int[][] arr;
static boolean[][] visited;
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, 1, 0, -1};
static int time = 0;
static int result = 0;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[n][m];
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<m; j++){
arr[i][j] = Integer.parseInt(st.nextToken());
if(arr[i][j] == 1)
result++;
}
}
while(true){
visited = new boolean[n][m];
outair(0, 0);
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(arr[i][j] == 1 && isEdge(i, j)){
dfs(i, j);
}
}
}
change();
changeAir();
time++;
int tmp = countCheese();
if(tmp!=0){
result = countCheese();
}else
break;
}
System.out.println(time);
System.out.println(result);
//외부공기는 외부공기로 체크를 해둬야함
//가장자리 치즈를 확인
}
//외부공기를 2로 체크
public static void outair(int x, int y){
visited[x][y] = true;
arr[x][y] = 2;
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx<0 || ny<0 || nx>=n || ny>=m)
continue;
if(arr[nx][ny]==0 && !visited[nx][ny])
outair(nx, ny);
}
}
public static void dfs(int x, int y){
visited[x][y] = true;
arr[x][y] = -2;
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx<0 || ny<0 || nx>=n || ny>=m)
continue;
if(arr[nx][ny]==1 && !visited[nx][ny] && isEdge(nx, ny)){
dfs(nx, ny);
}
}
}
public static boolean isEdge(int x, int y){
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(arr[nx][ny] == 2)
return true;
}
return false;
}
public static void change(){
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(arr[i][j] == -2)
arr[i][j] = 2;
}
}
}
public static void changeAir(){
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(arr[i][j] == 2)
arr[i][j] = 0;
}
}
}
public static int countCheese(){
int cnt=0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(arr[i][j]==1)
cnt++;
}
}
return cnt;
}
}
BFS버전으로 풀어보기!
import java.io.*;
import java.util.*;
class Main {
static int n, m;
static int[][] arr;
static boolean[][] visited;
static int cheeseCnt;
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, 1, 0, -1};
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[n][m];
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<m; j++){
arr[i][j] = Integer.parseInt(st.nextToken());
if(arr[i][j] == 1)
cheeseCnt++;
}
}
int cnt = 0;
int time = 0;
while(cheeseCnt !=0){
cnt = cheeseCnt;
time++;
visited = new boolean[n][m];
outAir();
}
System.out.println(time);
System.out.println(cnt);
}
public static void outAir(){
visited[0][0] = true;
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{0, 0});
while(!q.isEmpty()){
int[] xy = q.poll();
for(int i=0; i<4; i++){
int nx = xy[0] + dx[i];
int ny = xy[1] + dy[i];
if(nx<0 || ny<0 || nx>=n || ny>=m || visited[nx][ny])
continue;
visited[nx][ny] = true;
if(arr[nx][ny] == 0){
q.add(new int[]{nx, ny});
}else{
cheeseCnt--;
arr[nx][ny] = 0;
}
}
}
}
public static boolean isEdge(int x, int y){
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(arr[nx][ny] == 2 )
return false;
}
return true;
}
public static int countCheese(){
int cnt = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(arr[i][j] == 1)
cnt++;
}
}
return cnt;
}
}
Last updated
Was this helpful?