728x90
오답 노트 & 새로 알게 된 점
풀이는 BFS를 이용하여 최소 경로를 구했다.
가장 왼쪽 위 칸부터 가장 오른쪽 아래 칸까지 범위를 모두 탐색하면서 1이 있는지 없는지 판단했다.
처음에는 bfs를 아래와 같이 짰다.
for (int i = 0; i < 4; i++) {
int X = info.x + dx[i];
int Y = info.y + dy[i];
if(!isRangeTrue(X, Y)) continue;
if(visit[X][Y]) continue;
q.offer(new Info(X, Y, info.cnt + 1));
visit[X][Y] = true;
}
static boolean isRangeTrue(int x, int y) {
int X = x + hei - 1;
int Y = y + wid - 1;
if(x < 1 || x > row || y < 1 || y > col || X > row || Y > col) return false;
for (int i = x; i <= X; i++) {
for (int j = y; j <= Y; j++) {
if(A[i][j] == 1) return false;
}
}
return true;
}
하지만 이렇게 되면 움직일 때마다 모든 X, Y를 이중 포문 돌리기 때문에 TLE가 난다(내 생각)
따라서 bfs에서 미리 걸러주는 것이 좋다.
1. X,Y의 범위가 격자판을 넘어가는지
2. 가장 왼쪽 위 칸이 옮길 수 있는지
2-1) 옮길 수 있다면 isRangeTrue를 호출하여 검사하는 것이다.
코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
import java.io.*;
import java.util.*;
public class Main {
static int atoi(String str) {
return Integer.parseInt(str);
}
static int row, col, hei, wid;
static int A[][];
static Info start = null, end = null;
static int dx[] = {0, 0, 1, -1};
static int dy[] = {1, -1, 0, 0};
static boolean visit[][];
static int ans = -1;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
input();
pro();
}
static void pro() {
bfs();
if(sb.length() == 0) sb.append(-1);
System.out.println(sb);
}
static void bfs() {
Queue<Info> q = new ArrayDeque<>();
q.offer(start);
visit[start.x][start.y] = true;
while (!q.isEmpty()) {
Info info = q.poll();
if(info.x == end.x && info.y == end.y){
sb.append(info.cnt);
return;
}
for (int i = 0; i < 4; i++) {
int X = info.x + dx[i];
int Y = info.y + dy[i];
if(X < 1 || X > row || Y < 1 || Y > col) continue;
if(!visit[X][Y] && A[X][Y] == 0){
if(!isRangeTrue(X, Y)) continue;
q.offer(new Info(X, Y, info.cnt + 1));
visit[X][Y] = true;
}
}
}
}
static boolean isRangeTrue(int x, int y) {
int X = x + hei - 1;
int Y = y + wid - 1;
if(X > row || Y > col) return false;
for (int i = x; i <= X; i++) {
for (int j = y; j <= Y; j++) {
if(A[i][j] == 1) return false;
}
}
return true;
}
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 int[row + 1][col + 1];
visit = new boolean[row + 1][col + 1];
for (int i = 1; i <= row; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= col; j++) {
A[i][j] = atoi(st.nextToken());
}
}
st = new StringTokenizer(br.readLine());
hei = atoi(st.nextToken());
wid = atoi(st.nextToken());
start = new Info(atoi(st.nextToken()), atoi(st.nextToken()), 0);
end = new Info(atoi(st.nextToken()), atoi(st.nextToken()), 0);
}
static class Info{
int x, y, cnt;
public Info(int x, int y, int cnt) {
this.x = x;
this.y = y;
this.cnt = cnt;
}
}
}
|
cs |
728x90
'BOJ(Java)' 카테고리의 다른 글
자바(백준) 10711 모래성 (0) | 2021.12.10 |
---|---|
자바(백준) 4179 불! (0) | 2021.12.10 |
자바(백준) 17136 색종이 붙이기 (0) | 2021.11.30 |
자바(백준) 9935 문자열 폭발 (0) | 2021.11.29 |
자바(백준) 1726 로봇 (0) | 2021.11.29 |