數獨是一種傳統益智遊戲,你需要把乙個 9×9
'>
9×9 的數獨補充完整,使得圖中每行、每列、每個 3×3
'>
3×3 的九宮格內數字 1∼9
'>
1∼9 均恰好出現一次。
請編寫乙個程式填寫數獨。
輸入格式
輸入共 9
'>9
行,每行包含乙個長度為 9
'>9
的字串,用來表示數獨矩陣。
其中的每個字元都是 1∼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
這道題目顯然是深搜,但是不優化的深蒐會超時,所以採用以下優化方法:把每一行,每一列,每一九宮格已有的數字預處理在乙個陣列裡,在列舉點時只列舉沒有被標記過的數字,這樣了以提公升效率,但在極限資料的情況下還會超時,所以在列舉時候,我們先記錄所有可以填數的點的可填數量,從小到大來填,這樣就能輕鬆地a了。
#include typedeflong
long
ll;using
namespace
std;
const
int maxn=10+5
;char
a[maxn][maxn],b[maxn][maxn];
int hang[maxn][maxn],lie[maxn][maxn],jg[maxn][maxn][maxn],cnt,ok=0
;void dfs(int
cur)
return
; }
int min=9
,c;
for(i=1; i<=9; i++)
for(j=1; j<=9; j++)
if(a[i][j]=='.'
)
for(i=1; i<=9; i++)
if(hang[x][i]==0&&lie[y][i]==0&&jg[(x-1)/3][(y-1)/3][i]==0
)
}int
main()
dfs(1);
return0;
}
數獨簡單版
題目鏈結 數獨是一種傳統益智遊戲,你需要把乙個 9 9 的數獨補充完整,使得圖中每行 每列 每個 3 3 的九宮格內數字 1 9 均恰好出現一次。請編寫乙個程式填寫數獨。輸入共 9 行,每行包含乙個長度為 9 的字串,用來表示數獨矩陣 其中的每個字元都是 1 9 或 表示尚未填充 輸出補全後的數獨矩...
數獨 dfs 剪枝
參考 yxc 題意 就是給你乙個九宮格,讓你填數,使橫行包含1 9,縱行包含1 9,每一塊包含1 9 思路 本題採用深搜,然後通過用col和row分別記錄橫行和縱行沒有被用過的數,cell來標記沒有被用過的數,通過0代表這個數已經被用過了,1代表這個數沒有被用過,然後通過剪枝找到某個數可以填數的最小...
九宮格數獨 搜尋與剪枝
這兩道題的方法基本一樣 把乙個9行9列的網格,再細分為9個3 3的子網格,要求每行 每列 每個子網格內都只能使用一次1 9中的乙個數字,即每行 每列 每個子網格內都不允許出現相同的數字。0是待填位置,其他均為已填入的數字。要求填完九宮格並輸出 如果有多種結果,則只需輸出其中一種 如果給定的九宮格無法...