數獨簡單版(搜尋 剪枝)

2022-06-29 11:36:12 字數 1503 閱讀 1852

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

long

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是待填位置,其他均為已填入的數字。要求填完九宮格並輸出 如果有多種結果,則只需輸出其中一種 如果給定的九宮格無法...