Today
Total
Archives
05-18 16:22
관리 메뉴

tony9402

[백준 2178] 미로탐색 본문

알고리즘/Baekjoon Online Judge

[백준 2178] 미로탐색

ssu_gongdoli 2018. 8. 21. 02:52
반응형

백준 2178 미로탐색







이 문제는 (1,1)부터 시작해 (N,M)로 가는 길 중 가장 짧게 갈 수 있는 경로를 찾는 것이다. 

최단 경로를 구하는 문제는 대부분 BFS로 푸는 문제이다. 따라서 이 문제도 BFS로 푸는 문제이다.


BFS는 queue를 이용하는데 queue에서 pop할때 도착 지점의 좌표가 나올때까지 하면 된다.

문제에 길은 무조건 있다고 하니깐 그냥 없을 경우를 생각하지 않고 계속 push하고 pop을 하면 된다.



1. pair가 있다는 걸 몰랐을 때 짠 소스(queue에 대해서 독학 했을 때...)



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
#include<cstdio>
#include<queue>
 
struct xy
{
    int i;
    int j;
};
 
int input[100][100= { 0 };
 
std::queue<xy> Q;
 
int main()
{
    int N, M, i ,j;
    scanf("%d %d"&N, &M);
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < M; j++)
        {
            scanf("%1d"&input[i][j]);
        }
    }
 
    Q.push({ 0,0 });
    int qi, qj, qsize;
    int sum = 0;
 
    while (!Q.empty())
    {
        sum++;
        qsize = Q.size();
        while (qsize--) {
            qi = Q.front().i;
            qj = Q.front().j;
            Q.pop();
            if (qi == N - 1 && qj == M - 1)break;
            if (qi >= 1 && input[qi - 1][qj] == 1) {
                input[qi - 1][qj] = 0;
                Q.push({ qi - 1,qj });
            }
            if (qi < N - 1 && input[qi + 1][qj] == 1)
            {
                input[qi + 1][qj] = 0;
                Q.push({ qi + 1,qj });
            }
            if (qj >= 1 && input[qi][qj - 1== 1)
            {
                input[qi][qj - 1= 0;
                Q.push({ qi, qj - 1 });
            }
            if (qj < M - 1 && input[qi][qj + 1== 1)
            {
                input[qi][qj + 1= 0;
                Q.push({ qi,qj + 1 });
            }
        }
        if (qi == N - 1 && qj == M - 1)break;
    }
    printf("%d", sum);
    return 0;
}

cs




2. 위 소스를 제출하고 2달이 지난 후



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
#include<cstdio>
#include<queue>
 
using namespace std;
 
queue<pair<intint>> Q;
 
int map[100][100= { 0 };
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
int N, M;
 
bool Check(int x, int y)
{
    return (x >= 0 && x < M && y >= 0 && y < N);
}
 
int main()
{
    int i ,j;
    scanf("%d %d"&N, &M);
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < M; j++)
        {
            scanf("%1d"&map[i][j]);
        }
    }
 
    Q.push(make_pair(0,0));
    int qi, qj, qsize;
    int sum = 0;
 
    while (!Q.empty())
    {
        sum++;
        qsize = Q.size();
        while (qsize--) {
            qi = Q.front().first;
            qj = Q.front().second;
            Q.pop();
            if (qi == N - 1 && qj == M - 1)break;
            for(int k=0;k<4;k++)
            {
                int qx = qj + dx[k];
                int qy = qi + dy[k];
                if(!Check(qx,qy))continue;
                if(map[qy][qx])
                {
                    map[qy][qx] = 0;
                    Q.push(make_pair(qy,qx));
                }
            }
        }
        if (qi == N - 1 && qj == M - 1)break;
    }
    printf("%d", sum);
    return 0;
}

cs


반응형

'알고리즘 > Baekjoon Online Judge' 카테고리의 다른 글

[백준 4179] 불!  (0) 2018.08.22
[백준 5427] 불  (0) 2018.08.22
[백준 2606] 바이러스  (3) 2018.08.17
[백준 10026] 적록색약  (0) 2018.08.16
[백준 1012번] 유기농 배추  (0) 2018.08.16
Comments