Algorithm/그래프 탐색

BOJ#2665 미로 만들기

밤이2209 2017. 4. 13. 12:51

BOJ#2665 미로 만들기


* 문제



* 풀이

쉬운 문제입니다. 20년 묵은 문제네요, 😅

왜 쉽냐면,
검은 방을 흰색 방으로 바꾸는 개수의 제한도 없고, 바꿀 때 필요한 규칙도 없기 때문입니다.

그냥 이 문제는.. 다익스트라 돌리면 됩니다.

비슷한 문제 : 
1261번 - 알고스팟 https://www.acmicpc.net/problem/1261
2206번 - 벽 부수고 이동하기 https://www.acmicpc.net/problem/2206


* 나의 코드



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;

/**
* BOJ#2665 미로 만들기
* https://www.acmicpc.net/problem/2665
*/

public class Main {

static final int[] dRow = {0, -1, 0, 1};
static final int[] dCol = {-1, 0, 1, 0};
static final int BLACK = 0;
static final int WHITE = 1;
static final int INF = 1000000000;

static int n;
static int[][] map = new int[51][51];
static int[][] dist = new int[51][51];
static boolean[][] discovered = new boolean[51][51];

static {

for (int i = 0; i < 51; i++) {

Arrays.fill(dist[i], INF);
}
}

public static void main(String[] args) throws IOException {

// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

n = Integer.parseInt(br.readLine());

for (int i = 0; i < n; i++) {

String s = br.readLine();
for (int j = 0; j < n; j++) {

map[i][j] = s.charAt(j) - '0';
}
}

// solve
PriorityQueue<Point> pq = new PriorityQueue<Point>();

pq.add(new Point(0, 0, 0));
dist[0][0] = 0;

while (!pq.isEmpty()) {

Point u = pq.poll();

if (u.row == n - 1 && u.col == n - 1) break;

if (dist[u.row][u.col] < u.dist) continue;

for (int i = 0; i < 4; i++) {

int nextRow = u.row + dRow[i];
int nextCol = u.col + dCol[i];

if (nextRow < 0 || nextRow >= n || nextCol < 0 || nextCol >= n) continue;
if (discovered[nextRow][nextCol]) continue;

// WHITE
if (map[nextRow][nextCol] == WHITE) {

if (dist[nextRow][nextCol] > dist[u.row][u.col]) {

dist[nextRow][nextCol] = dist[u.row][u.col];
}
}
// BLACK
else {

if (dist[nextRow][nextCol] > dist[u.row][u.col] + 1) {

dist[nextRow][nextCol] = dist[u.row][u.col] + 1;
}
}

pq.add(new Point(nextRow, nextCol, dist[nextRow][nextCol]));
discovered[nextRow][nextCol] = true;
}

} // ~while loop

System.out.println(dist[n-1][n-1]);
}
}

class Point implements Comparable<Point> {

int row, col;
int dist;

Point(int row, int col, int dist) {

this.row = row;
this.col = col;
this.dist = dist;
}

@Override
public int compareTo(Point o) {

return this.dist < o.dist ? -1 : 1;
}
}


'Algorithm > 그래프 탐색' 카테고리의 다른 글

BOJ#2638 치즈  (0) 2017.04.14
BOJ#1938 통나무 옮기기  (0) 2017.04.13
BOJ#1194 달이 차오른다, 가자.  (0) 2017.04.13
BOJ#5427 불  (1) 2017.04.12
BOJ#1726 로봇  (4) 2017.04.12