DY N DY

BOJ 2178 미로 탐색(C++) 본문

PARK/ALGORITHM

BOJ 2178 미로 탐색(C++)

손세지 2016. 8. 17. 16:11


시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB121973274194625.395%

문제

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

101111
101010
101011
111011

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

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

입력

첫째 줄에 두 정수 N, M(2≤N, M≤100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

예제 입력 

4 6
101111
101010
101011
111011

예제 출력 

15

예제 입력 2 

4 6
110110
110110
111111
111101

예제 출력 2 

9

힌트

알고리즘 분류


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
#include    <stdio.h>
#include    <vector>
#include    <queue>
#include    <string>
#include    <iostream>
#pragma warning(disable : 4996)
 
 
static int MAP[111][111];
static int VISIT[111][111];
static std::queue<std::pair<intint>> q;
void bfs()
{
    while (!q.empty())
    {
        std::pair<intint> p = q.front();
        q.pop();
 
        VISIT[p.first][p.second] = 1;
        if (MAP[p.first - 1][p.second] == 1 && VISIT[p.first - 1][p.second] == 0)
        {
            MAP[p.first - 1][p.second] = MAP[p.first][p.second] + 1;
            q.push(std::pair<intint>(p.first - 1, p.second));
        }
        if (MAP[p.first][p.second + 1== 1 && VISIT[p.first][p.second + 1== 0)
        {
            MAP[p.first][p.second + 1= MAP[p.first][p.second] + 1;
            q.push(std::pair<intint>(p.first, p.second + 1));
        }
        if (MAP[p.first][p.second - 1== 1 && VISIT[p.first][p.second - 1== 0)
        {
            MAP[p.first][p.second - 1= MAP[p.first][p.second] + 1;
            q.push(std::pair<intint>(p.first, p.second - 1));
        }
        if (MAP[p.first + 1][p.second] == 1 && VISIT[p.first + 1][p.second] == 0)
        {
            MAP[p.first + 1][p.second] = MAP[p.first][p.second] + 1;
            q.push(std::pair<intint>(p.first + 1, p.second));
        }
    }
}
 
 
int main()
{
    int N, M;
    scanf("%d %d"&N, &M);
    std::string in;
    for (int i = 1; i <= N; ++i)
    {
        std::cin >> in;
        for (int j = 0; j < in.length(); ++j)
        {
            if (in[j] == '1')
                MAP[i][j+1= 1;
        }
    }
    MAP[1][1= 1;
    q.push(std::pair<intint>(11));
    bfs();
 
    printf("%d", MAP[N][M]);
 
    return 0;
}
cs

BFS. 특별히 다른 BFS와 다른 점은 없는 것 같다. 

숨바꼭질

장기

등과도 비슷.

'PARK > ALGORITHM' 카테고리의 다른 글

BOJ 5014 스타트링크(Elevator Trouble)(C++)  (0) 2016.08.18
BOJ 1932 숫자삼각형(C++)  (0) 2016.08.18
BOJ 10816 숫자 카드2(C++)  (0) 2016.08.17
BOJ 10815 숫자 카드(C++)  (0) 2016.08.17
BOJ 1697 숨바꼭질(C++)  (0) 2016.08.17