PS/브루트포스 알고리즘[Bruteforce]

백준 2210 숫자판 점프(c++)

SeungbeomKim 2023. 1. 24. 17:00

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 + Bruteforce 문제입니다. 중복 값을 제거해주는 Set를 선언해줍니다. 그리고 길이가 6이 될 때 까지 값을 하나씩 추가해줘야하는데, 예시를 들어 값이 112에서 1을 추가한다면 112(기존 값) * 10 + 1(새로운 값)이 되어야 합니다. 

그래서 함수 세 번째 파라미터에서 함수 num * 10 + a[nx][ny]를 호출해주었습니다. 

 

<코드>

#include <iostream>
#include <set>
#define n 5
using namespace std;

set<int> ans;
int a[6][6];
int mov[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
void go(int x, int y, int num, int len)
{
    if (len == 6)
    {
        ans.insert(num);
        return;
    }
    for (int k = 0; k < 4; k++)
    {
        int nx = x + mov[k][0];
        int ny = y + mov[k][1];
        if (nx >= 0 && nx < n && ny >= 0 && ny < n)
        {
            go(nx, ny, num * 10 + a[nx][ny], len + 1);
        }
    }
}
int main()
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> a[i][j];
        }
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            go(i, j, a[i][j], 1);
        }
    }
    cout << ans.size() << '\n';
}