[백준 1261번] 알고스팟

2017. 7. 13. 00:49알고리즘/백준

반응형






풀이


BFS 해결가능하리라 보았지만 조금의 트릭이 있다.


벽을 만났을 경우 큐의 맨끝에 삽입하고 길을 만났을 경우에는 큐의 맨앞에 삽입해주어 길을 만나는 경우에 우선순위를 먼저 두어야한다.


오른쪽으로 한칸가서 벽이면 큐의 맨끝에 삽입

                            길이면 큐의 맨앞에 삽입



왼쪽으로 한칸가서 벽이면 큐의 맨끝에 삽입

                         길이면 큐의 맨앞에 삽입



위쪽으로 한칸가서 벽이면 큐의 맨끝에 삽입

                            길이면 큐의 맨앞에 삽입



아래쪽으로 한칸가서 벽이면 큐의 맨끝에 삽입

                            길이면 큐의 맨앞에 삽입



이순서대로 풀어야 우선순위에 맞게 길을찾는다. 벽을 최소한으로 부숴야하기때문에 길이 있다면 길로 먼저 갈수있도록 해주어야한다.



소스코드


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
#include <iostream>
using namespace std;
 
int n, m, map[103][103], wall_arr[103][103];
int que[100001], head=10,tail=10;
 
void push(int x, int y) {
    que[tail++= x * 10000 + y;
}
 
int pop() {
    return que[head++];
}
 
void bfs() {
    while (head != tail) {
        int pos = pop();
        int x = pos / 10000;
        int y = pos % 10000;
 
        // 벽이 없으면 이전 정보 복붙
        // 벽이 있으면 wall_arr의 이전 정보 +1
        if (x + 1 <= n - 1 && map[x + 1][y] == 1 && wall_arr[x + 1][y] == -1) {
            wall_arr[x + 1][y] = wall_arr[x][y] + 1;
            push(x + 1, y); 
        }
        else if (x + 1 <= n - 1 && map[x + 1][y] == 0 && wall_arr[x + 1][y] == -1) {
            wall_arr[x + 1][y] = wall_arr[x][y];
            que[--head] = (x + 1* 10000 + y;
        }
 
 
        if (x - 1 >= 0 && map[x - 1][y] == 1 && wall_arr[x - 1][y] == -1) {
            wall_arr[x - 1][y] = wall_arr[x][y] + 1;
            push(x - 1, y);
        }
        else if (x - 1 >= 0 && map[x - 1][y] == 0 && wall_arr[x - 1][y] == -1) {
            wall_arr[x - 1][y] = wall_arr[x][y];
            que[--head] = (x - 1* 10000 + y;
        }
 
 
        if (y + 1 <= m - 1 && map[x][y + 1== 1 && wall_arr[x][y + 1== -1) {
            wall_arr[x][y + 1= wall_arr[x][y] + 1;
            push(x, y + 1);
        }
        else if (y + 1 <= m - 1 && map[x][y + 1== 0 && wall_arr[x][y + 1== -1) {
            wall_arr[x][y + 1= wall_arr[x][y];
            que[--head] = (x * 10000+ (y + 1);
        }
 
 
        if (y - 1 >= 0 && map[x][y - 1== 1 && wall_arr[x][y - 1== -1) {
            wall_arr[x][y - 1= wall_arr[x][y] + 1;
            push(x, y - 1);
        }
        else if (y - 1 >= 0 && map[x][y - 1== 0 && wall_arr[x][y - 1== -1) {
            wall_arr[x][y - 1= wall_arr[x][y];
            que[--head] = (x * 10000+ (y - 1);
        }
    }
}
 
int main() {
    cin >> m >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            char s;
            cin >> s;
            map[i][j] = s - '0';
            wall_arr[i][j] = -1;
        }
    }
    push(00);
    wall_arr[0][0= 0;
    bfs();
    cout << wall_arr[n - 1][m - 1<< '\n';
    return 0;
}
cs
















반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 10971번] 외판원 순회 2  (0) 2017.07.23
[백준 10844번] 쉬운 계단 수  (0) 2017.07.13
[백준 2580번] 스도쿠  (0) 2017.07.13
[백준 2161번] 카드1  (0) 2017.07.05
[백준 6603번] 로또  (0) 2017.07.05