-
백준 7562번: 나이트의 이동코테 풀이 2023. 12. 18. 20:46
이 문제는 4 * 4 체스판을 직접 그려보고 한 시작점에서 모든 칸을 몇 칸 안에 도달할 수 있는지 직접 구해본다면 접근 방법을 찾을 수 있다.
다음은 4 * 4 체스판의 (0,0)에서 출발 했을 때 모든 칸에 도달하는 최소 이동 횟수다.
만약 (3,2) 칸에 몇 번만에 도달하는지 알고 싶다면 체스판을 그래프화 하여 graph[3][2]의 값을 구하면 된다.
다음은 손 코딩으로 흐름을 나타낸 것이다.
다음은 정답 java 코드이다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static int whereIs(int x, int y, int[][] graph, int end_x, int end_y) { int[] dx = {-1, 1, 2, -2, 2, 1, -2, -1}; int[] dy = {2, 2, 1, 1, -1, -2, -1, -2}; Queue<int[]> queue = new LinkedList<int[]>(); int[] list = {x,y}; queue.add(list); while(queue.size()!=0) { int[] data = queue.poll(); int cur_i = data[0]; int cur_j = data[1]; for(int r=0; r<8; r++) { int next_i = cur_i + dx[r]; int next_j = cur_j + dy[r]; if(next_i>=0 && next_i<graph.length && next_j>=0 && next_j<graph[0].length) { if(graph[next_i][next_j] < 0) { graph[next_i][next_j] = graph[cur_i][cur_j]+1; int[] next_list = {next_i, next_j}; queue.add(next_list); } } } } return graph[end_x][end_y]; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); StringBuilder sb = new StringBuilder(); int n = Integer.parseInt(st.nextToken()); for(int i=0; i<n; i++) { st = new StringTokenizer(br.readLine()); int k = Integer.parseInt(st.nextToken()); //k * k int[][] graph = new int[k][k]; //초기화값 = 0 for(int j=0; j<k; j++) { for(int p=0; p<k; p++) { graph[j][p] = -1; } } st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); graph[x][y] = 0; st = new StringTokenizer(br.readLine()); int end_x = Integer.parseInt(st.nextToken()); int end_y = Integer.parseInt(st.nextToken()); sb.append(whereIs(x, y, graph, end_x, end_y)+"\n"); } bw.write(sb.toString()); bw.flush(); bw.close(); } }
'코테 풀이' 카테고리의 다른 글
백준 15686 치킨 배달 - 조합, 백트레킹 (1) 2024.02.07 백준 - 16236번 아기상어 (1) 2024.01.19 백준 2579번: 계단 오르기 (1) 2023.12.17 백준 22862번: 가장 긴 짝수 연속한 부분 수열(large) (0) 2023.12.04 백준 10799 쇠막대기 풀이 (2) 2023.12.01