728x90
문제
5×5 크기의 숫자판이 있다. 각각의 칸에는 숫자(digit, 0부터 9까지)가 적혀 있다. 이 숫자판의 임의의 위치에서 시작해서, 인접해 있는 네 방향으로 다섯 번 이동하면서, 각 칸에 적혀있는 숫자를 차례로 붙이면 6자리의 수가 된다. 이동을 할 때에는 한 번 거쳤던 칸을 다시 거쳐도 되며, 0으로 시작하는 000123과 같은 수로 만들 수 있다.
숫자판이 주어졌을 때, 만들 수 있는 서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램을 작성하시오.
입력
다섯 개의 줄에 다섯 개의 정수로 숫자판이 주어진다.
출력
첫째 줄에 만들 수 있는 수들의 개수를 출력한다.
백트래킹 문제이다. 5x5 크기의 좌표에서 6개의 숫자를 연속으로 골라서 만들 수 있는 수들의 개수를 구해야 한다.
(1,1) 부터 (5,5)까지 차례대로 방문하며 만들 수 있는 모든 숫자를 탐색하자.
dfs로 완전탐색하며 만들어온 숫자를 계속 더한다.
6개의 숫자를 모두 방문했으면 visit 여부를 파악하고 결과 개수를 늘리거나 넘어간다.
C++ 코드
#include <iostream>
using namespace std;
int p[6][6];
int dx[4] = { -1,0,0,1 };
int dy[4] = { 0,-1,1,0 };
int visit[1000000];
int res;
void dfs(int x, int y, int sum, int cnt) {
if (cnt == 5) {
if (visit[sum] == 0) {
visit[sum] = 1;
res++;
}
return;
}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 1 || ny < 1 || nx>5 || ny>5) continue;
dfs(nx, ny, sum * 10 + p[nx][ny], cnt + 1);
}
}
int main()
{
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 5; j++)
cin >> p[i][j];
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 5; j++)
dfs(i, j, p[i][j], 0);
cout << res;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1로 만들기 2 (12852번) (0) | 2020.03.21 |
---|---|
[백준] N-Queen (9663번) (0) | 2020.03.19 |
[백준] 분산처리 (1009번) (0) | 2020.03.19 |
[백준] 이모티콘 (14226번) (0) | 2020.03.14 |
[백준] 사전 (1256번) (0) | 2020.03.12 |