반응형
https://www.acmicpc.net/problem/17142
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 |