728x90
오답 노트 & 새로 알게 된 점
문제에서 "다음 시간에 물이 찰 예정인 칸으로 고슴도치는 이동할 수 없다"라는 말의 뜻을 잘 이해해야합니다.
이 말의 뜻은 물을 먼저 퍼지게 한 다음에 고슴도치를 움직이면 됩니다.
입력을 받을 때, 물이 나올 경우에 먼저 큐에 넣어줍니다.
그리고 나서 bfs를 시작할 때, 제일 마지막에 고슴도치의 위치를 넣어주었습니다.
bfs를 할 때는 물일 경우에는 문제 조건에 맞게 물을 퍼뜨리면 되고,
물이 아니면 고슴도치를 움직였습니다.
특히 물이 퍼질 때는 A 배열에 퍼지는 물의 위치를 기록해주었습니다.
코드
package bfs_dfs;
import java.io.*;
import java.util.*;
public class BOJ3055 {
static int atoi(String str) {
return Integer.parseInt(str);
}
static int row, col;
static char A[][];
static boolean visit[][];
static Queue<Point> q = new ArrayDeque<>();
static Point end, start;
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, 1, -1};
public static void main(String[] args) throws IOException {
input();
pro();
}
static void pro() {
bfs(start);
}
static void bfs(Point st) {
q.offer(start);
visit[st.x][st.y] = true;
while (!q.isEmpty()) {
Point p = q.poll();
if(p.x == end.x && p.y == end.y){
System.out.println(p.cnt);
return;
}
if(A[p.x][p.y] == '*'){
for (int i = 0; i < 4; i++) {
int X = p.x + dx[i];
int Y = p.y + dy[i];
if(!isRangeTrue(X,Y)) continue;
if(visit[X][Y]) continue;
if(A[X][Y] == 'D' || A[X][Y] == 'X') continue;
q.offer(new Point(X, Y, p.cnt));
visit[X][Y] = true;
A[X][Y] = '*';
}
}
else{
for (int i = 0; i < 4; i++) {
int X = p.x + dx[i];
int Y = p.y + dy[i];
if(!isRangeTrue(X,Y)) continue;
if(visit[X][Y]) continue;
if(A[X][Y] == '*' || A[X][Y] == 'X') continue;
q.offer(new Point(X, Y, p.cnt + 1));
visit[X][Y] = true;
}
}
}
System.out.println("KAKTUS");
}
static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
row = atoi(st.nextToken());
col = atoi(st.nextToken());
A = new char[row][col];
visit = new boolean[row][col];
for (int i = 0; i < row; i++) {
String s = br.readLine();
for (int j = 0; j < col; j++) {
A[i][j] = s.charAt(j);
if(A[i][j] == '*') q.offer(new Point(i, j, 0));
if(A[i][j] == 'D') end = new Point(i, j, 0);
if(A[i][j] == 'S') start = new Point(i, j, 0);
}
}
}
static boolean isRangeTrue(int x, int y) {
return x >= 0 && x < row && y >= 0 && y < col;
}
static class Point{
int x, y, cnt;
public Point(int x, int y, int cnt) {
this.x = x;
this.y = y;
this.cnt = cnt;
}
}
}
728x90
'BOJ(Java)' 카테고리의 다른 글
자바(백준) 2252 줄 세우기 (0) | 2021.11.05 |
---|---|
자바(백준) 17836 공주님을 구해라! (0) | 2021.11.03 |
자바(백준) 1600 말이 되고픈 원숭이 (0) | 2021.10.27 |
자바(백준) 1018 체스판 다시 칠하기 (0) | 2021.10.22 |
자바(백준) 1120 문자열 (0) | 2021.10.21 |