-
[SWEA 4193 - JAVA] 수영대회 결승전Algorithm 2020. 11. 9. 18:25반응형
삼성이를 우승시키기위한 최단 경로의 시간을 출력하자!
신호등 문제로 BFS에 현재시간과 소용돌이를 건널 수 있는 시간을 비교해서 큐에 넣어준다.
소용돌이의 시간이 일정하기 때문에 신호등이나 견우와직녀보다는 비교적 쉬운 문제다.
풀이 방법
- 시작점을 큐에 넣어준다.
- 큐 사이즈를 받아서 사이즈 만큼 돌아준다 (시간 체크)
- 소용돌이를 만날 경우 건널 수 없으면 다시 큐에 넣어준다.
- 2번을 체크해서 BFS를 구현할 경우 visit배열을 int형으로 해줄 필요가 없다 (메모이제이션 불필요)
import java.io.*; import java.util.*; public class Solution { public static int N, ans; public static int[][] map; public static boolean[][] v; public static int[] S, E; public static int[] dx = {-1, 1, 0, 0}; public static int[] dy = {0, 0, -1, 1}; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; int T = Integer.parseInt(br.readLine()); for (int tc = 1; tc <= T; tc++) { N = Integer.parseInt(br.readLine()); map = new int[N][N]; v = new boolean[N][N]; S = new int[2]; E = new int[2]; 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()); } } st = new StringTokenizer(br.readLine()); S[0] = Integer.parseInt(st.nextToken()); S[1] = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); E[0] = Integer.parseInt(st.nextToken()); E[1] = Integer.parseInt(st.nextToken()); if (isAnswer(S[0], S[1])) System.out.println("#"+tc+" "+0); else System.out.println("#"+tc+" "+bfs()); } } public static int bfs() { Queue<int[]> que = new LinkedList<int[]>(); que.offer(S); v[S[0]][S[1]] = true; int time = 0; while(!que.isEmpty()) { int size = que.size(); for (int t = 0; t < size; t++) { int[] cur = que.poll(); for (int i = 0; i < 4; i++) { int nx = cur[0] + dx[i]; int ny = cur[1] + dy[i]; if (!isBoundary(nx, ny) || map[nx][ny] == 1 || v[nx][ny]) continue; if (isAnswer(nx, ny)) return time+1; if (map[nx][ny] == 2) { if ((time < 2 || (time-2)%3 != 0)) { que.offer(cur.clone()); continue; } } que.offer(new int[] {nx, ny}); v[nx][ny] = true; } } time++; } return 0; } public static boolean isBoundary(int nx, int ny) { return nx >= 0 && nx < N && ny >= 0 && ny < N; } public static boolean isAnswer(int nx, int ny) { return nx == E[0] && ny == E[1]; } }
'Algorithm' 카테고리의 다른 글
[백준 3108 - JAVA] 로고 (0) 2020.11.09 [SWEA 3234 - 준환이의 양팔저울] (0) 2020.11.09 [백준 1726 - JAVA] 로봇 (0) 2020.11.09 [백준 9019 - JAVA] DSLR (0) 2020.11.09 [SWEA 4727 - JAVA] 견우와 직녀 (0) 2020.11.09