日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单数独

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单数独 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數獨是一種傳統益智游戲,你需要把一個 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; }

總結

以上是生活随笔為你收集整理的简单数独的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。