문제 : https://www.acmicpc.net/problem/8598
일단은 무지성으로 BFS 돌리면 되는 문제긴 하다. 그래서 딱히 안적을까 했는데, 언어가 이상하다보니 번역기 돌려도 놓칠만한 부분 적어봄. 'x'는 못감. 'z'가 시작점. 'n'이 도착지점. 다만 문제 특성상 n에서 출발해서 z에 도착해도 상관은 없다. 그리고 제일 중요한 부분은 길이 존재하지 않을 경우 "NIE"를 출력해야 한다.
코드 : https://github.com/NaHwaSa/BOJ_BaekjunOnlineJudge/blob/master/08500/BOJ_8598.java
import java.io.DataInputStream;
import java.io.IOException;
import java.sql.Array;
import java.util.ArrayDeque;
import java.util.Queue;
class Pos {
int r, c;
public Pos(int r, int c) {
this.r = r;
this.c = c;
}
}
public class Main extends FastInput {
private static final int[] DR = {1,1,-1,-1,2,2,-2,-2};
private static final int[] DC = {2,-2,2,-2,1,-1,1,-1};
private int bfs(Queue<Pos> q, Pos goal, int[][] v, int r, int c) {
while (!q.isEmpty()) {
Pos cur = q.poll();
if (cur.r==goal.r && cur.c==goal.c) {
return v[goal.r][goal.c]-1;
}
for (int d = 0; d < 8; d++) {
int nr = cur.r+DR[d];
int nc = cur.c+DC[d];
if (nr<0||nr>=r||nc<0||nc>=c||v[nr][nc]!=0) continue;
v[nr][nc] = v[cur.r][cur.c]+1;
q.add(new Pos(nr, nc));
}
}
return -1;
}
private void solution() throws Exception {
int r = nextInt();
int c = nextInt();
Queue<Pos> q = new ArrayDeque<>();
Pos goal = null;
int[][] v = new int[r][c];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
switch(nextChar()) {
case 'z' : q.add(new Pos(i, j)); v[i][j]=1; break;
case 'n' : goal = new Pos(i, j); break;
case 'x' : v[i][j] = -1; break;
}
}
}
int answer = bfs(q, goal, v, r, c);
System.out.println(answer==-1?"NIE":answer);
}
public static void main(String[] args) throws Exception {
initFI();
new Main().solution();
}
}
class FastInput {
private static final int DEFAULT_BUFFER_SIZE = 1 << 16;
private static DataInputStream inputStream;
private static byte[] buffer;
private static int curIdx, maxIdx;
protected static void initFI() {
inputStream = new DataInputStream(System.in);
buffer = new byte[DEFAULT_BUFFER_SIZE];
curIdx = maxIdx = 0;
}
protected static int nextInt() throws IOException {
int ret = 0;
byte c = read();
while (c <= ' ') c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
return ret;
}
protected static char nextChar() throws IOException {
byte c = read();
while (c <= ' ') c = read();
return (char)c;
}
private static byte read() throws IOException {
if (curIdx == maxIdx) {
maxIdx = inputStream.read(buffer, curIdx = 0, DEFAULT_BUFFER_SIZE);
if (maxIdx == -1) buffer[0] = -1;
}
return buffer[curIdx++];
}
}
'PS > BOJ' 카테고리의 다른 글
백준 15725 자바 - 다항함수의 미분 (BOJ 15725 JAVA) (0) | 2021.11.24 |
---|---|
백준 4781 자바 - 사탕 가게 (BOJ 4781 JAVA) (0) | 2021.11.23 |
백준 1747 자바 - 소수&팰린드롬 (BOJ 1747 JAVA) (0) | 2021.11.23 |
백준 5966 자바 - Cow Cotillion (BOJ 5966 JAVA) (0) | 2021.11.23 |
백준 21187 자바 - Pulling Their Weight (BOJ 21187 JAVA) (0) | 2021.11.22 |
댓글