SWEA::1249 보급로


시작점부터 끝점까지 최저비용을 누적시키면서 탐색하면 된다.

처음에 visited배열을 안쓰려고 했는데, 시작점부터 0 0 으로 진행되는경우 무한루프에 빠져서 visited 배열을 사용하여 풀었다. 그치만 풀고나니 비용 저장하는 d배열을 99999이런식으로 초기화 한 후

d[ax][ay] == 0 조건을 빼고 bfs 돌려도 된다.

두가지 코드 모두 첨부한다.


<visited배열을 사용한 경우>


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 <queue>
#include <memory.h>
using namespace std;
 
int t, n;
int map[100][100];
int d[100][100];
bool visited[100][100];
 
struct Node {
    int x;
    int y;
    Node(int _x, int _y) {
        x = _x;
        y = _y;
    }
};
 
void bfs() {
    queue<Node> q;
    q.push(Node(00));
    visited[0][0= true;
    int dx[] = { 1,-1,0,0 };
    int dy[] = { 0,0,1,-1 };
    while (!q.empty()) {
        int x = q.front().x;
        int y = q.front().y;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int ax = x + dx[i];
            int ay = y + dy[i];
            if (ax >= 0 && ay >= 0 && ax < n&&ay < n) {
                if (!visited[ax][ay] || d[ax][ay] > d[x][y] + map[ax][ay]) {
                    d[ax][ay] = d[x][y] + map[ax][ay];
                    q.push(Node(ax, ay));
                    visited[ax][ay] = true;
                }
            }
        }
    }
}
 
void init() {
    memset(d, 0sizeof(d));
    memset(visited, falsesizeof(visited));
}
 
int main() {
    scanf("%d"&t);
    for (int tc = 1; tc <= t; tc++) {
        init();
        scanf("%d"&n);
        char buf[101];
        for (int i = 0; i < n; i++) {
            scanf("%s"&buf);
            for (int j = 0; j < n; j++) {
                map[i][j] = buf[j] - '0';
            }
        }
 
        bfs();
        printf("#%d %d\n", tc, d[n - 1][n - 1]);
    }
}
cs





<d배열을 9999로 초기화 해서 해결하는 경우>


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
#include <stdio.h>
#include <queue>
#include <memory.h>
using namespace std;
 
int t, n;
int map[100][100];
int d[100][100];
 
struct Node {
    int x;
    int y;
    Node(int _x, int _y) {
        x = _x;
        y = _y;
    }
};
 
void bfs() {
    queue<Node> q;
    q.push(Node(00));
    int dx[] = { 1,-1,0,0 };
    int dy[] = { 0,0,1,-1 };
    while (!q.empty()) {
        int x = q.front().x;
        int y = q.front().y;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int ax = x + dx[i];
            int ay = y + dy[i];
            if (ax >= 0 && ay >= 0 && ax < n&&ay < n) {
                if (d[ax][ay] > d[x][y] + map[ax][ay]) {
                    d[ax][ay] = d[x][y] + map[ax][ay];
                    q.push(Node(ax, ay));
                }
            }
        }
    }
}
 
void init() {
    memset(d, 9999sizeof(d));
    d[0][0= 0;
}
 
int main() {
    scanf("%d"&t);
    for (int tc = 1; tc <= t; tc++) {
        init();
        scanf("%d"&n);
        char buf[101];
        for (int i = 0; i < n; i++) {
            scanf("%s"&buf);
            for (int j = 0; j < n; j++) {
                map[i][j] = buf[j] - '0';
            }
        }
 
        bfs();
        printf("#%d %d\n", tc, d[n - 1][n - 1]);
    }
}
cs


'SWEA::문제풀이' 카테고리의 다른 글

2477 차량 정비소  (0) 2018.02.07
2115 벌꿀채취  (0) 2018.01.30
1953 탈주범 검거  (0) 2018.01.23
2105 디저트 카페  (0) 2018.01.21
2817 부분수열의 합  (0) 2018.01.19

+ Recent posts