简单数独
數獨是一種傳統益智游戲,你需要把一個 9×9 的數獨補充完整,使得圖中每行、每列、每個 3×3 的九宮格內數字 1~9 均恰好出現一次。
請編寫一個程序填寫數獨。
輸入格式
輸入共 9 行,每行包含一個長度為 9 的字符串,用來表示數獨矩陣。
其中的每個字符都是 1~9 或 .(表示尚未填充)。
輸出格式
輸出補全后的數獨矩陣。
數據保證有唯一解。
輸入樣例:
.2738…1.
.1…6735
…29
3.5692.8.
…
.6.1745.3
64…
9518…7.
.8…6534.
輸出樣例:
527389416
819426735
436751829
375692184
194538267
268174593
643217958
951843672
782965341
因為9*9并不大,暴力搜索即可。
我們知道如果當前需要填入一個數,需要滿足三個條件。
同行,同列和當前這個元素所在的小九宮格,不能含有要填的這個數。
用三個數組標記即可。
row[i][j]表示i行填有數字j
col[i][j]表示i列填有數字j
cell[3][3][j]表示i這個九宮格填有數字j
如何表示在第幾個九宮格吶,通過觀察,假如坐標(x,y)=(5,4)
[0][0]為第一個,[0][1]為第二個,[0][2]為第三個九宮格,以此類推。
下標從0開始,
那么
00,01,02
10,11,12
20,21,22
橫縱坐標/3就是代表第幾個九宮格。
然后搜索即可,搜索完過后,記得回溯,看有沒有其他的填法。
#include <iostream> #include<bits/stdc++.h> using namespace std; const int maxn=1e6; typedef long long ll; const int N=10; int row[N][N],col[N][N],cell[3][3][N]; char g[N][N]; int dfs(int x,int y) {if(y==9)x++,y=0;//到達每一行的末尾過后,轉移到下一行if(x==9)//搜完了,保證有解,直接輸出結果即可{for(int i=0;i<9;i++){cout<<g[i]<<endl;}return 1;}if(g[x][y]!='.')//當前行的元素是數字,遍歷下一個元素即可return dfs(x,y+1);else{for(int i=0;i<9;i++)//當前空是需要填入數字,一一枚舉9個數字看是否滿足條件{if(!row[x][i]&&!col[y][i]&&!cell[x/3][y/3][i]){g[x][y]=i+'1';row[x][i]=col[y][i]=cell[x/3][y/3][i]=1;//標記if(dfs(x,y+1)) return 1;row[x][i]=col[y][i]=cell[x/3][y/3][i]=0;//回溯,看是否有其他解g[x][y]='.';}}} return 0; } int main() {for(int i=0;i<9;i++)cin>>g[i];for(int i=0;i<9;i++)for(int j=0;j<9;j++){if(g[i][j]!='.'){int t=g[i][j]-'1';row[i][t]=col[j][t]=cell[i/3][j/3][t]=1;}}dfs(0,0);return 0; }總結
- 上一篇: 基于Docker的Redis集群简单搭建
- 下一篇: nginx 配置 http/2(h2)