본문 바로가기
Programming/Algorithm

백준 2210 숫자판 점프

by OKOK 2018. 3. 30.

1. 아이디어 처음에 안떠오르면 어렵지 않은 문제이고, 꼼꼼히 풀기만 하면 됩니다.

숫자판이 작기 때문에 dfs 로 풀어도 무방합니다.


2. 만들었던 숫자는 visit 함수를 이용해서 표시를 해줍니다.


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
/*
1951 시작합니다.
 
서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램
visit 로 갔던 숫자는 체크하지 않도록 합니다.
0 0 0 1 2 3 이면 6차원로 만들어볼까요?
depth 를 6으로 설정하도로 하고,
 
각 자리에서 시작하도록 하겠습니다.
숫자를 바로 만들어서 vist 체크하도록 하겠습니다.
*/
 
#include <iostream>
#include <algorithm>
using namespace std;
 
#define SIZE 5
int map[SIZE][SIZE];
int ans;
int visit[1000000];
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int dataArr[6];
int val;
 
void problemIn() {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            cin >> map[i][j];
        }
    }
}
 
void dfs(int depth, int x, int y) {
    if (depth == 6) {
        val = 0;
        for (int i = 0; i < 6; i++) {
            val += dataArr[i] * pow(10, 5 - i);
        }
        if (visit[val] == 0) {
            visit[val] = 1;
            ans++;
        }
        return;
    }
 
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx < 0 || ny < 0 || nx >= 5 || ny >= 5) continue;
        dataArr[depth] = map[nx][ny];
        dfs(depth + 1, nx, ny);
        dataArr[depth] = 0;
    }
}
 
void solve() {
    
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            dataArr[0] = map[i][j];
            dfs(1, i, j);
            dataArr[0] = 0;
        }
    }
}
 
int main() {
    problemIn();
    solve();
    cout << ans << endl;
    return 0;
}
cs