-

[DFS] 백준 2210번 - 숫자판 점프 본문

3. DFS & 백트래킹

[DFS] 백준 2210번 - 숫자판 점프

asdklfjlasdlfkj 2020. 2. 7. 19:35

https://www.acmicpc.net/problem/2210

 

2210번: 숫자판 점프

111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, 212121 이 가능한 경우들이다.

www.acmicpc.net

백준 DFS 문제다.

set 컨테이너를 활용해 풀면 쉽게 풀 수 있다.

갈 수 있는 방향으로 중복허용해 5번 이동하여 만들 수 있는 문자열의 개수를 출력하는 문제다.

 

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
#include <set>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
int max_answer = -1;
vector<vector<string> > map;
set<string> s;
 
typedef struct dir{
    int dr, dc;
}dir;
dir direction[4= { { 01 }, { 10 }, { 0-1 }, { -10 } };
 
void dfs(int jumpcnt, string val, int r, int c){
    if (jumpcnt == 5){
        s.insert(val);
        return;
    }
    for (int i = 0; i < 4; i++){
        int nr = r + direction[i].dr;
        int nc = c + direction[i].dc;
        if (0 <= nr && nr < 5 && 0 <= nc && nc < 5){
            dfs(jumpcnt + 1, val + map[nr][nc], nr, nc);
        }
    }
}
 
int main(){
    map.assign(5vector<string>(5""));
    for (int i = 0; i < 5; i++){
        for (int j = 0; j < 5; j++){
            int ele;
            cin >> ele;
            map[i][j] = map[i][j] + to_string(ele);
        }
    }
    for (int i = 0; i < 5; i++){
        for (int j = 0; j < 5; j++){
            dfs(0, map[i][j], i, j);
        }
    }
    cout << s.size() << '\n';
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

Comments