Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 이분 매칭
- Zuul
- dp
- 플로이드 와샬
- 메모이제이션
- 주울
- 도커
- 구현
- ZuulFilter
- Spring Cloud Config
- 달팽이
- Logback
- 다익스트라
- spring boot
- 비트마스킹
- 스택
- 스프링 시큐리티
- Gradle
- docker-compose
- spring cloud
- 구간 트리
- 이분 탐색
- BFS
- 트리
- 게이트웨이
- 유레카
- 완전 탐색
- 백트래킹
- Java
- 서비스 디스커버리
Archives
- Today
- Total
Hello, Freakin world!
[백준 7562번][Java] 나이트의 이동 본문
import java.io.*;
import java.util.*;
/*
나이트의 이동
https://www.acmicpc.net/problem/7562
*/
public class Main {
static int t,n;
public static void main(String[] args) throws IOException {
// InputReader reader = new InputReader("testcase.txt");
InputReader reader = new InputReader();
t = reader.readInt();
StringBuilder sb = new StringBuilder();
for (int tc = 0; tc < t; tc++) {
n = reader.readInt();
StringTokenizer st = new StringTokenizer(reader.readLine());
Point start = new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
st = new StringTokenizer(reader.readLine());
Point dest = new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
sb.append(bfs(start, dest)+"\n");
}
sb.deleteCharAt(sb.length()-1);
System.out.println(sb.toString());
}
static int[] dc = {1,2,2,1,-1,-2,-2,-1};
static int[] dr = {2,1,-1,-2,-2,-1,1,2};
private static int bfs(Point start, Point dest) {
Queue<Point> q = new ArrayDeque<>();
boolean[][] discovered = new boolean[n][n];
int[][] dist = new int[n][n];
q.add(start);
discovered[start.row][start.col] = true;
dist[start.row][start.col] = 0;
while(!q.isEmpty()) {
Point here = q.poll();
if(here.equals(dest)) break;
for (int i = 0; i < 8; i++) {
int nextRow = here.row + dr[i];
int nextCol = here.col + dc[i];
if(isRange(nextRow, nextCol) && !discovered[nextRow][nextCol]) {
discovered[nextRow][nextCol] = true;
q.add(new Point(nextRow, nextCol));
dist[nextRow][nextCol] = dist[here.row][here.col] + 1;
}
}
}
return dist[dest.row][dest.col];
}
private static boolean isRange(int row, int col) {
if(row < 0 || row >= n || col < 0 || col >= n) return false;
return true;
}
}
class Point {
int row, col;
public Point(int row, int col) {
this.row = row;
this.col = col;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
if (row != point.row) return false;
return col == point.col;
}
@Override
public int hashCode() {
int result = row;
result = 31 * result + col;
return result;
}
}
class InputReader {
private BufferedReader br;
public InputReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public InputReader(String filepath) {
try {
br = new BufferedReader(new FileReader(filepath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public List<Character> readLineIntoCharList() throws IOException {
List<Character> l = new ArrayList<>();
while(true) {
int readVal = br.read();
if(readVal == '\n' || readVal == -1) break;
l.add((char)readVal);
}
return l;
}
public boolean ready() throws IOException {
return br.ready();
}
public String readLine() throws IOException {
return br.readLine();
}
public int readInt() throws IOException {
return Integer.parseInt(readLine());
}
public Long readLong() throws IOException {
return Long.parseLong(readLine());
}
}
bfs를 이용하는 전형적인 최단거리 문제입니다.
모든 간선을 1로 설정하고 정해진 8방향으로 bfs를 수행하면 답을 얻을 수 있습니다.
'알고리즘 > PS' 카테고리의 다른 글
[백준 11723번][Java] 집합 - 비트마스크 집합 연산 구현하기 (0) | 2020.10.03 |
---|---|
[백준 2357번][Java] 최솟값과 최댓값 - 구간 트리, 람다의 성능 (0) | 2020.09.29 |
[백준 14888번][Java] 연산자 끼워넣기 - 완전탐색, 백트래킹 (0) | 2020.09.27 |
[백준 5397번][Java] 키로거 - 덱 (0) | 2020.09.26 |
[백준 9935번][Java] 문자열 폭발 - 스택 (0) | 2020.09.26 |
Comments