728x90

문제

5×5 크기의 숫자판이 있다. 각각의 칸에는 숫자(digit, 0부터 9까지)가 적혀 있다. 이 숫자판의 임의의 위치에서 시작해서, 인접해 있는 네 방향으로 다섯 번 이동하면서, 각 칸에 적혀있는 숫자를 차례로 붙이면 6자리의 수가 된다. 이동을 할 때에는 한 번 거쳤던 칸을 다시 거쳐도 되며, 0으로 시작하는 000123과 같은 수로 만들 수 있다.

숫자판이 주어졌을 때, 만들 수 있는 서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램을 작성하시오.

입력

다섯 개의 줄에 다섯 개의 정수로 숫자판이 주어진다.

출력

첫째 줄에 만들 수 있는 수들의 개수를 출력한다.


백트래킹 문제이다. 5x5 크기의 좌표에서 6개의 숫자를 연속으로 골라서 만들 수 있는 수들의 개수를 구해야 한다.

(1,1) 부터 (5,5)까지 차례대로 방문하며 만들 수 있는 모든 숫자를 탐색하자.

dfs로 완전탐색하며 만들어온 숫자를 계속 더한다. 

6개의 숫자를 모두 방문했으면 visit 여부를 파악하고 결과 개수를 늘리거나 넘어간다.

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/%EC%88%AB%EC%9E%90%ED%8C%90%20%EC%A0%90%ED%94%84%20(2210%EB%B2%88).cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

 

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

+ Recent posts