본문 바로가기

ProgramSoliving

백준 : 17142

반응형

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

 

17142번: 연구소 3

인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고, 활성 상태인 바이러스는 상하좌우로 인접한 모든 빈 칸으로 동시에 복제되며, 1초가 걸린다. 승원이는 연구소의 바이러스 M개를 활성 상태로 변경하려고 한다. 연구소는 크기가 N×N인 정사각형으로 나타낼 수 있으며, 정사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는

www.acmicpc.net

 

DFS로 순서쌍 Combi 만들고

 

BFS로 시간탐색 하면된다.

 

바이러스가 못옮기는 경우에는 max값을 반환하고 DFS마다 min값을 갱신하면된다.

 

출력시 Max값으로 그대로면 -1 반환

 

아니면 최소시간반환

 

package com.ssay.algo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class B17142 {
	static int N, M;
	static int[][] map;
	static int minTime = Integer.MAX_VALUE;
	static int endValue;
	static int[] dy = {0,0,1,-1};
	static int[] dx = {1,-1,0,0};

	public static class Pair {
		int y;
		int x;
		int cnt;

		public Pair(int y, int x) {
			this.y = y;
			this.x = x;
		}

		public Pair(int y, int x, int cnt) {
			this.y = y;
			this.x = x;
			this.cnt = cnt;
		}

	}

	public static Pair[] pick;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		map = new int[N][N];
		pick = new Pair[M];

		ArrayList<Pair> list = new ArrayList<Pair>();
		endValue = N * N;
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if (map[i][j] == 2) {
					list.add(new Pair(i, j));
					endValue--;
				} else if (map[i][j] == 1) {
					endValue--;
				}
			}
		}

		DFS(0, 0, list);
		if(minTime == Integer.MAX_VALUE) {
			System.out.println(-1);
		}else {
			System.out.println(minTime);
		}
	}

	public static void DFS(int cnt, int start, ArrayList<Pair> list) {
		if (cnt == M) {
			minTime = Math.min(minTime, BFS());
			return;
		}

		for (int i = start; i < list.size(); i++) {
			pick[cnt] = new Pair(list.get(i).y, list.get(i).x);
			DFS(cnt + 1, i + 1, list);
		}

	}

	public static int BFS() {
		Queue<Pair> q = new LinkedList<Pair>();
		boolean[][] check = new boolean[N][N];
		

		for(int i=0;i<M;i++) {
			q.add(new Pair(pick[i].y,pick[i].x,0));
		}
		int curCnt = 0;
		int ny,nx;
		while(!q.isEmpty()) {
			Pair tmp = q.poll();
			//3이 바이러스 감염
			check[tmp.y][tmp.x] = true;
			if(map[tmp.y][tmp.x] == 0)
				curCnt++;
			if(endValue == curCnt) {
				return tmp.cnt;
			}
			
			for(int d=0;d<4;d++) {
				ny = tmp.y +dy[d];
				nx = tmp.x +dx[d];
				if(ny<0||nx<0||ny>=N||nx>=N) continue;
				if(check[ny][nx] == true) continue;
				if(map[ny][nx] == 1) continue;
				check[ny][nx] = true;
				q.add(new Pair(ny,nx,tmp.cnt +1));
					
			}
		}
		return Integer.MAX_VALUE;
		

	}
}
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 17136  (0) 2020.02.07
백준 : 1916  (0) 2020.02.07
백준 : 17143  (0) 2020.02.03
백준 : 17822 JAVA  (0) 2020.02.02
백준 : 16236 JAVA  (0) 2020.02.02