백트래킹을 이용하여 완전탐색 하는 문제이다.
1. map입력 받을때 0값인 곳의 좌표를 vector에 푸쉬 한다.
2. 가로 세로 3x3칸에 대해 타당함을 확인하는 isPromising() 함수를 만든다.
3. 완전 탐색 한다.
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 74 75 76 77 78 79 80 81 82 | #include <iostream> #include <vector> #define P pair<int,int> using namespace std; int map[9][9]; vector<P> v; bool flag; //타당성 여부 확인 bool isPromising(int x,int y) { int check = 0; for (int i = 0; i < 9; i++) { if (map[x][i] == 0) continue; if (check & (1 << map[x][i]))return false; check |= (1 << map[x][i]); } check = 0; for (int i = 0; i < 9; i++) { if (map[i][y] == 0) continue; if (check & (1 << map[i][y]))return false; check |= (1 << map[i][y]); } check = 0; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if ((x / 3 == i / 3) && (y / 3 == j / 3)) { if (map[i][j] == 0) continue; if (check & (1 << map[i][j]))return false; check |= (1 << map[i][j]); } } } return true; } void printAll() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cout << map[i][j] << " "; } cout << "\n"; } } //백트래킹 void dfs(int idx) { if (flag) return; if (idx == v.size()) { printAll(); flag = true; } else { int x = v[idx].first; int y = v[idx].second; for (int i = 1; i <= 9; i++) { map[x][y] = i; if (isPromising(x, y)) { dfs(idx + 1); } map[x][y] = 0; } } } int main() { ios_base::sync_with_stdio(false); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cin >> map[i][j]; if (map[i][j] == 0) v.push_back(P(i, j)); } } flag = false; dfs(0); } | cs |
'BOJ::문제풀이' 카테고리의 다른 글
16234 인구 이동 (0) | 2018.10.22 |
---|---|
15684 사다리 조작 (0) | 2018.09.07 |
15683 감시 (7) | 2018.04.18 |
15686 드래곤 커브 (0) | 2018.04.16 |
15686 치킨 배달 (3) | 2018.04.16 |