본문 바로가기

Problem/ETC

[C/C++] BOJ 2210 :: 숫자판 점프

BOJ 2210 :: 숫자판 점프



문제 링크 : https://www.acmicpc.net/problem/2210






만들 수 있는 수를 백트래킹하며 찾아내는 문제이다.


수는 (현재 만들어진수*10 + 보드에 쓰여진 수)를 하며 갱신하였고 수의 마지막 자리를 지울 때에는 10을 나누면서 지워나갔다.

중요한 것은 지워 나갈 때, 초기 값인 0으로 number를 되돌리기 위해서는 함수 바깥에서 한번 더 지워주어야 한다는 것이다!




나의 코드



Guithub : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_2210/BOJ_2210.cpp




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
// 백준알고리즘 2210번 :: 숫자판 점프
#include<iostream>
using namespace std;
 
int ans;
int board[5][5];
bool flag[1000000];
int number;
 
int dx[4= { 0,0,1,-1 };
int dy[4= { 1,-1,0,0 };
 
void search(int x, int y, int count)
{
    number = number*10 + board[x][y];
 
    if(count == 6)
    {
        // 이미 체크된 숫자인지 확인
        if (!flag[number]) {
            flag[number] = true;
            ans++;
        }
        return;
    }
 
    for (int i = 0; i < 4; i++)
    {
        int mx = x + dx[i];
        int my = y + dy[i];
 
        if (mx >= 0 && mx < 5 && my >= 0 && my < 5)
        {
            search(mx, my, count+1);
            number /= 10;
        }
    }
}
 
int main()
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cin >> board[i][j];
        }
    }
 
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            search(i, j, 1);
            number /= 10;
        }
    }
 
    cout << ans;
 
    return 0;
}
cs