1. 아이디어 처음에 안떠오르면 어렵지 않은 문제이고, 꼼꼼히 풀기만 하면 됩니다. 숫자판이 작기 때문에 dfs 로 풀어도 무방합니다. 2. 만들었던 숫자는 visit 함수를 이용해서 표시를 해줍니다. |
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 63 64 65 66 67 68 69 70 71 72 73 | /* 1951 시작합니다. 서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램 visit 로 갔던 숫자는 체크하지 않도록 합니다. 0 0 0 1 2 3 이면 6차원로 만들어볼까요? depth 를 6으로 설정하도로 하고, 각 자리에서 시작하도록 하겠습니다. 숫자를 바로 만들어서 vist 체크하도록 하겠습니다. */ #include <iostream> #include <algorithm> using namespace std; #define SIZE 5 int map[SIZE][SIZE]; int ans; int visit[1000000]; int dx[] = { 0,0,1,-1 }; int dy[] = { 1,-1,0,0 }; int dataArr[6]; int val; void problemIn() { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { cin >> map[i][j]; } } } void dfs(int depth, int x, int y) { if (depth == 6) { val = 0; for (int i = 0; i < 6; i++) { val += dataArr[i] * pow(10, 5 - i); } if (visit[val] == 0) { visit[val] = 1; ans++; } return; } for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx < 0 || ny < 0 || nx >= 5 || ny >= 5) continue; dataArr[depth] = map[nx][ny]; dfs(depth + 1, nx, ny); dataArr[depth] = 0; } } void solve() { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { dataArr[0] = map[i][j]; dfs(1, i, j); dataArr[0] = 0; } } } int main() { problemIn(); solve(); cout << ans << endl; return 0; } | cs |