본문으로 바로가기

[Java] 백준 2178 미로찾기

category CS/Algorithm 2017. 4. 7. 21:40

문제

N×M크기의 배열로 표현되는 미로가 있다.

101111
101010
101011
111011

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.


https://www.acmicpc.net/problem/2178


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
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
public class Main {
 
    static int[][] graph = new int[100][100];
    static boolean[][] visited = new boolean[100][100];
    static int n = 0;
    static int m = 0;
    static int len[] = { 001-1 };
    static int wid[] = { 1-100 };
 
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        n = input.nextInt();
        m = input.nextInt();
 
        String nString = "";
        for (int i = 0; i < n; i++) {
            nString = input.next();
            for (int j = 0; j < m; j++) {
                graph[i][j] = Integer.parseInt(nString.charAt(j) + "");
            }
        }
 
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 100; j++) {
                visited[i][j] = false;
            }
        }
 
        find();
    }
 
    private static void find() {
 
        int roadCount = 0;
        int qSize;
        int temp;
        int r;
        int c;
        int finish = 0;
 
        Queue<Integer> q = new LinkedList<Integer>();
        q.offer(0);
 
        while (finish != 1) {
            qSize = q.size();
 
            for (int i = 0; i < qSize; i++) {
                temp = q.poll();
                r = temp / 100;
                c = temp % 100;
 
                if (r == n - 1 && c == m - 1) {
                    roadCount++;
                    System.out.println(roadCount);
                    finish = 1;
                }
 
                for (int j = 0; j < 4; j++) {
                    int nr = r + wid[j];
                    int nc = c + len[j];
 
                    if (nr >= n || nr < 0 || nc >= m || nc < 0)
                        continue;
 
                    if (graph[nr][nc] == 0)
                        continue;
 
                    if (visited[nr][nc])
                        continue;
 
                    visited[nr][nc] = true;
                    q.offer(nr * 100 + nc);
                }
            }
            roadCount++;
        }
    }
}
cs


'CS > Algorithm' 카테고리의 다른 글

[Algorithm] TSP 세일즈맨 알고리즘  (0) 2017.06.28
[Java] 백준9663 N-Queen  (0) 2017.05.21
[Java] 백준 2252 쉬운 위상정렬  (0) 2017.05.21
[Java] 백준 1005 위상정렬  (0) 2017.05.21
[Java] 백준 1260 DFS BFS  (0) 2017.04.07