공부공간

BOJ - 2636 ) 치즈 본문

알고리즘/완전탐색(BFS,DFS)

BOJ - 2636 ) 치즈

개발자가될수있을까? 2020. 5. 15. 19:04


https://www.acmicpc.net/problem/2636

 

2636번: 치즈

첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다. 세로와 가로의 길이는 최대 100이다. 판의 각 가로줄의 모양이 윗 줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진��

www.acmicpc.net

 


그래프에 간선이 0과 1밖에 없는 경우 특정 시점에서 특정값을 구할때 0-1 BFS를 사용한다.

 

즉 몇번의 BFS를 통하여 모양이 만들어지는지? 약간말이 이상한데. 위 문제에서는 몇개의 C를 거치면 

 

map의 위치로 갈 수 있는지? 와 치즈가 녹는 시간은 동치이다.

 

0,0은 치즈가 없음이 보장되어있기에 이쪽에서 bfs를 시작해서 c를 만나면 덱에 뒤쪽에, c를만나지 않으면 덱의 

 

앞쪽에 넣어서 만난 c의개수가 적은것부터 처리하게 진행한다.

 

최종적으로 max와 max와 같은개수인 cnt가 정답인 문제.

 


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class 치즈 {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int map[][] = new int[N][M];
		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());
			}
		}
		int res[][] = new int[N][M];
		int max = 0;
		int count = 0;
		boolean visit[][] = new boolean[N][M];
		ArrayDeque<int []> dq = new ArrayDeque<>();
		dq.addFirst(new int[] {0,0,0});
		visit[0][0] = true;
		int dir[][] = {{1,0},{-1,0},{0,-1},{0,1}};
		while(!dq.isEmpty()) {
			int now[] = dq.poll();
			int y = now[0];
			int x = now[1];
			int cnt = now[2];
			for(int i = 0 ; i < 4 ; i ++) {
				int ny = y + dir[i][0];
				int nx = x + dir[i][1];
				if(ny >= 0 && nx >= 0 && ny < N && nx < M) {
					if(!visit[ny][nx]) {
						visit[ny][nx] = true;
						if(map[ny][nx] ==1) {
							res[ny][nx] = cnt+1;
							if(max < cnt+1) {
								max = cnt+1;
								count =0;
							} 
							if(max == cnt+1) {
								count++;
							}
							dq.addLast(new int[] {ny,nx,cnt+1});
						} else {
							dq.addFirst(new int[] {ny,nx,cnt});
						}
					}
				}
			}
		}
		System.out.println(max);
		System.out.println(count);
	}
}

'알고리즘 > 완전탐색(BFS,DFS)' 카테고리의 다른 글

BOJ -16929 ) Two Dots  (1) 2020.06.02
BOJ - 18809 ) Gaaaaaaaaaarden  (1) 2020.05.28
BOJ - 16236 ) 아기상어  (0) 2020.05.13
BOJ - 2234 ) 성곽  (0) 2020.05.07
BOJ - 10971 ) 외판원 순회2  (0) 2020.05.07
Comments