백트래킹로도 풀 수 있지만 충분히 DFS로도 가능한 문제.
처음에 접근을 잘못해서 굉장히 헤멨다.
garo[i][j]는 i 번쨰 가로에 j라는 수가 들어갔는지를 나타내는... 식으로 sero와 sq를 선언했다.
그중에서도 3X3 구역을 정하는 3*(x/3) + (y/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 83 84 85 86 87 88 89 | #include<stdio.h> #include<iostream> #include<vector> #include<queue> using namespace std; int n = 9; int map[9][9]; vector<pair<int, int>>v; bool garo[9][10]; bool sero[9][10]; bool sq[9][10]; bool out = false; void dfs(int idx) { if (out) { return; } if (idx == v.size()) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cout << map[i][j] << " "; } cout << endl; } out = true; return; } int x = v[idx].first; int y = v[idx].second; int sqnum = 3 * (x / 3) + (y / 3); for (int i = 1; i <= 9; i++) { if (garo[x][i] == false && sero[y][i] == false && sq[sqnum][i] == false) { garo[x][i] = true; sero[y][i] = true; sq[sqnum][i] = true; map[x][y] = i; dfs(idx + 1); garo[x][i] = false; sero[y][i] = false; sq[sqnum][i] = false; } } } void sqcheck(int il, int jl, int sqnum) { for (int i = il; i < il + 3; i++) { for (int j = jl; j < jl + 3; j++) { sq[sqnum][map[i][j]] = true; } } } int main() { //freopen("Text.txt", "r", stdin); int cnt = 0; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cin >> map[i][j]; garo[i][map[i][j]] = true; sero[j][map[i][j]] = true; if (map[i][j] == 0) v.push_back(make_pair(i, j)); } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { sqcheck(i * 3, j * 3, cnt); cnt++; } } dfs(0); return 0; } | cs |
'BOJ' 카테고리의 다른 글
백준 1062 / 가르침 (0) | 2019.01.25 |
---|---|
백준 14391 / 종이 조각 (0) | 2019.01.24 |
백준 9663 / N-Queen (0) | 2019.01.21 |
백준 1248 / 맞춰봐 (0) | 2019.01.21 |
백준 14889 / 스타트와 링크 (0) | 2019.01.19 |