序:
早上作了一個」高級「難度的數獨發現真是難到爆炸,因而乎決定寫一個暴力程序枚舉一下,因而出現此文。
思路很簡單,深搜便可,每次check一下,不行就回溯。
話很少說,很簡單,直接上代碼。ios
/* About: sudoku Auther: kongse_qi Date:2017/05/03 */ #include <iostream> #include <cstdio> #include <cstdlib> #define maxn 9 #define read(x) scanf("%d", &x) int x[maxn][maxn]; void Read() { for(int i = 0; i != maxn; ++i) { for(int j = 0; j != maxn; ++j) { read(x[i][j]); } } return ; } bool Check(int a, int b, int n) { for(int i = 0; i != maxn; ++i) { if(x[a][i] == n && i != b) return false; } for(int i = 0; i != maxn; ++i) { if(x[i][b] == n && i != a) return false; } for(int i = a/3*3; i != a/3*3+3; ++i) { for(int j = b/3*3; j != b/3*3+3; ++j) { if(x[i][j] == n && (i != a || b != j)) return false; } } return true; } void Print() { for(int i = 0; i != maxn; ++i) { for(int j = 0; j != maxn; ++j) { printf("%d ", x[i][j]); } printf("\n"); } return ; } bool Dfs(int tot) { if(tot > 80) { return true; } int curx = tot/9, cury = tot%9; if(!x[curx][cury]) { for(int i = 1; i != 10; ++i) { x[curx][cury] = i; if(Check(curx, cury, i)) { if(Dfs(tot+1)) return true; } x[curx][cury] = 0; } } else return Dfs(tot+1); return false; } int main() { freopen("test.in", "r", stdin); Read(); Dfs(0); Print(); return 0; }
水了一篇...
箜瑟_qi 2017/05/05 11:55code