-
18405 경쟁적 전염백준/그래프 이론 2024. 6. 22. 23:17
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.StringTokenizer; class Position{ int x; int y; int virus; Position(int x, int y, int virus) { this.x = x; this.y = y; this.virus = virus; } } public class Main { static int map[][]; static int N; static int K; static Queue<Position> q; static int S; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); N = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken()); map = new int [N+1][N+1]; q = new LinkedList<>(); List<Position> list = new ArrayList<>(); for(int i=1; i<=N; i++) { st = new StringTokenizer(br.readLine(), " "); for(int j= 1; j<=N; j++) { int value = Integer.parseInt(st.nextToken()); map[i][j] = value; // 바이러스인 경우 if(value != 0) { list.add(new Position(i,j, value)); } } } // 바이러스 번호가 작을수록 앞으로 위치 Collections.sort(list, new Comparator<Position>() { @Override public int compare(Position p1, Position p2) { return p1.virus - p2.virus; } }); for(int i=0; i<list.size(); i++) { Position p = list.get(i); q.add(new Position(p.x,p.y,p.virus)); } st = new StringTokenizer(br.readLine(), " "); S = Integer.parseInt(st.nextToken()); int X = Integer.parseInt(st.nextToken()); int Y = Integer.parseInt(st.nextToken()); bfs(); System.out.println(map[X][Y]); } public static void bfs() { int time = 1; int virusType = q.peek().virus; // time(시간)은 같은 종류의 바이러스가 큐에서 다 나온 뒤 증가하므로 // time < S(문제에서 주어진 시간 제한) * K(바이러스 종류 개수) 때까지 while(!q.isEmpty() && time<S*K) { Position p = q.poll(); // time(시간)은 같은 종류의 바이러스가 큐에서 다 나온 뒤 증가 if(p.virus != virusType) { time++; virusType = p.virus; } int dx [] = {-1,1,0,0}; int dy [] = {0,0,-1,1}; for(int i=0;i<4; i++) { int nx = p.x + dx[i]; int ny = p.y + dy[i]; // 바이러스가 이동할 수 있으면 if(nx>0 && nx<=N && ny>0 && ny<=N && map[nx][ny]==0) { // 바이러스 이동시킴 map[nx][ny] = p.virus; q.add(new Position(nx, ny, p.virus)); } } } } }
'백준 > 그래프 이론' 카테고리의 다른 글
1707 이분 그래프 (0) 2024.06.19 16928 뱀과 사다리 게임 (0) 2024.06.18 3055 탈출 (0) 2024.06.18 1068 트리 (0) 2024.06.12 14502 연구소 (2) 2024.06.10