Notice
Recent Posts
Recent Comments
Link
Dev.baelanche
[백준 2206] 벽 부수고 이동하기 본문
반응형
2차원 배열에서 BFS 를 순회하는데 벽을 한 번 부술 수 있다.
방문 정보 배열을 2층으로 구성하여 벽을 부수고 지나갔을 때의 정보와 벽을 안부쉈을때의 정보를 따로 기록한다.
큐에도 벽 부수기에 대한 정보를 담아 한번 부수면 더이상 부술수 없게 한다.
public class Main {
static int n;
static int m;
static int a[][];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
a = new int[n][m];
for(int i=0; i<n; i++) {
char c[] = sc.next().toCharArray();
for(int j=0; j<m; j++) {
a[i][j] = c[j] - 48;
}
}
bfs(0, 0);
}
public static void bfs(int x, int y) {
boolean visited[][][] = new boolean[2][n][m];
Queue<Pair> queue = new LinkedList<Pair>();
queue.offer(new Pair(x, y, 1));
visited[0][x][y] = true;
int result = 1;
boolean fin = false;
int mx[] = {1, 0, -1, 0};
int my[] = {0, 1, 0, -1};
while(!queue.isEmpty()) {
int size = queue.size();
while(size-->0) {
Pair point = queue.poll();
int px = point.x;
int py = point.y;
int pc = point.crash;
if(px == n-1 && py == m-1) fin = true;
for(int i=0; i<4; i++) {
int nx = px + mx[i];
int ny = py + my[i];
if(0 <= nx && nx < n && 0 <= ny && ny < m) {
if(a[nx][ny] == 1) {
if(pc == 1 && !visited[0][nx][ny]) {
visited[0][nx][ny] = true;
queue.offer(new Pair(nx, ny, 0));
}
} else {
if(visited[pc][nx][ny]) continue;
visited[pc][nx][ny] = true;
queue.offer(new Pair(nx, ny, pc));
}
}
}
}
if(fin) break;
result++;
}
System.out.println(fin == true ? result : -1);
}
static class Pair {
int x;
int y;
int crash;
Pair(int x, int y, int crash) {
this.x = x;
this.y = y;
this.crash = crash;
}
}
}
반응형
'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글
[백준 5014] 스타트링크 (0) | 2019.04.18 |
---|---|
[백준 7576] 토마토 (0) | 2019.04.18 |
[백준 3055] 탈출 (0) | 2019.04.18 |
[백준 5427] 불 (0) | 2019.04.17 |
[백준 6593] 상범 빌딩 (0) | 2019.04.17 |
Comments