알고리즘 문제풀이(C++)

[BOJ2210][C++] 숫자판 점프

hyowonii 2022. 3. 7. 14:25
 

2210번: 숫자판 점프

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

www.acmicpc.net

문제

임의의 시작점에서 상하좌우 네 방향으로 다섯 번 이동하며 만들 수 있는 6자리 수의 개수를 구한다.

 

해결

🎈Key Point🎈

dfs를 이용하여 문제를 해결한다.

 

모든 칸을 돌면서 그 칸을 시작점으로 하여 dfs를 돌려 만들 수 있는 모든 6자리 수를 구한다.

dfs를 실행시켜 시작점에서 상, 하, 좌, 우로 이동 후 각각에서 다시 dfs를 호출해 시작점에서부터 만들 수 있는 모든 6자리 수를 구한다.

구한 6자리 수는 set에 저장하여 중복되는 것을 제거하고 set.size()로 최종 6자리 수의 개수를 구한다.

 

[전체 코드]

#include <iostream>
#include <set>

using namespace std;

char board[5][5];
set<string> num_set;
string num = "000000";

void dfs(int x, int y, int cnt) {

	int dx[4] = { 0, -1, 0, 1 };
	int dy[4] = { -1, 0, 1, 0 };

	if (cnt == 6) {
		num_set.insert(num);
		return;
	}
	
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];

		if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5) {
			num[cnt] = board[nx][ny];
			dfs(nx, ny, cnt + 1);
		}
	}
}

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);

	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++) {
			dfs(i, j, 0);
		}
	}

	cout << num_set.size();
}