https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpLlKAQ4DFAUq


1. 문제 이해


L 시간동안 탈주범이 있을 수 있는 공간의 갯수를 세어보는 문제입니다.


2. 접근 방법


- dfs를 통해 문제에 접근하였습니다.

- 4방향으로 나누어 현재와 다음단계의 파이프를 비교하여 갈수 없는곳을 continue 시켰습니다.

- ret 이라는 변수를 따로 두어 지나간 곳을 1로 체크하여 1이 체크된 곳의 수를 세어 출력하였습니다.


(visit은 ret과 다른 용도 입니다. ret을 쓰지 않으면 갔던곳을 또 갈수 없기 때문에 1번(+)파이프일 경우에 오류가 생기게 됩니다.)


3. 문제 해결


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
#include <iostream>
#include <string.h>
#define MAX_SIZE 51
 
using namespace std;
 
int map[MAX_SIZE][MAX_SIZE];
bool visit[MAX_SIZE][MAX_SIZE];
bool ret[MAX_SIZE][MAX_SIZE];
int dx[] = { 010-1 };
int dy[] = { -1010 };
 
void dfs(int m, int n, int x, int y, int l, int d) {
    if (d == l) return;
 
    ret[y][x] = 1;
    int cur = map[y][x];
 
    for (int i = 0; i < 4; i++) {
        if (i == 0 && (cur == 3 || cur == 5 || cur == 6)) continue;
        if (i == 1 && (cur == 2 || cur == 6 || cur == 7)) continue;
        if (i == 2 && (cur == 3 || cur == 4 || cur == 7))continue;
        if (i == 3 && (cur == 2 || cur == 4 || cur == 5))continue;
 
        int nx = x + dx[i];
        int ny = y + dy[i];
 
        int next = map[ny][nx];
 
        if (nx < 0 || ny < 0 || nx >= m || ny >= n)continue;
        else if (map[ny][nx] == 0 || visit[ny][nx]) continue;
 
        if (i == 0 && (next == 3 || next == 4 || next == 7)) continue;
        if (i == 1 && (next == 2 || next == 4 || next == 5)) continue;
        if (i == 2 && (next == 3 || next == 5 || next == 6)) continue;
        if (i == 3 && (next == 2 || next == 6 || next == 7)) continue;
        
        visit[y][x] = 1;
        dfs(m, n, nx, ny, l, d + 1);
        visit[y][x] = 0;
    }
}
 
int main() {
    int t;
    cin >> t;
    for (int i = 1; i <= t; i++) {
        int n, m, r, c, l;
        cin >> n >> m >> r >> c >> l;
 
        memset(map, 0sizeof(map));
        memset(ret, falsesizeof(ret));
 
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < m; k++) {
                cin >> map[j][k];
            }
        }
 
        dfs(m, n, c, r, l, 0);
 
        int res = 0;
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < m; k++) {
                if (ret[j][k]) res++;
            }
        }
 
        cout << '#' << i << ' ' << res << '\n';
    }
    return 0;
}
cs


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

#14891. 톱니바퀴  (0) 2018.01.17
#14502. 연구소  (4) 2018.01.16
#1759. 암호 만들기  (0) 2017.12.29
#2140. 지뢰찾기  (0) 2017.12.29
#6305. 로또  (0) 2017.12.26

+ Recent posts