巧用dfs解數獨問題 演算法筆記

2021-10-04 10:44:29 字數 900 閱讀 7042

巧妙的用 n 表示 第n/9行第n%9列 (0是第乙個數)。

巧妙的用 row = (n/9)/33; col = n%9/33; 表示數獨裡面的小正方形(行、列)。那麼遍歷數獨就至於要乙個 n即可。 (0<=n < 81)

因為數獨答案唯一,所以只要找到乙個正確的,就可以 exit(0); 了。

#include

#include

//exit(0) 強制退出。(數獨只有唯一解)

using

namespace std;

int a[9]

[9];

//n為第n/9行第n%9列 //巧妙的用 n 表示了 行&列中所有位置

bool

judge

(int n,

int i)

//判斷 第n/9行第n%9列 數字 i 是否合法

int row =

(n/9)/

3*3;

//檢查小正方形 (這個方法好巧妙!利用n控制了小正方形) 40 4行4列 (3,3)--(5,5)

int col = n%9/

3*3;

for(

int b=row;b<=row+

2;b++)}

}return

true;}

void

dfs(

int n)

cout<}exit(0

);//因為答案唯一,所以可以直接退出 }if

(a[n/9]

[n%9])

//該點被填了,就填下乙個點

else}}

}int

main()

}dfs(0

);return0;

}

DFS求解數獨演算法

以前也想過很久解數獨的演算法,但是沒有得到很簡單的方法,某天看到某位學長的 恍然大悟,本以為暴力搜尋會很花時間 10 81種可能 沒想到實際上由於各種限制,列舉次數竟然普遍小於10000次,用dfs便可實現每種可能都列舉。這樣計算乙個數獨就很快了 不到1ms 下面附上自己理解改動並加了注釋的 dev...

回溯演算法 解數獨

假設 判斷 假設 class solution def solve self,arr self.helper arr,0 defhelper self,arr,index if index 81 print arr return else if arr index 0 0代表需要填充資料 for i...

數獨問題 解數獨

數獨是乙個非常有名的遊戲。整個是乙個9x9的大宮格,其中又被劃分成9個3x3的小宮格。要求在每個小格中放入1 9中的某個數字。要求是 每行 每列 每個小宮格中數字不能重複。現要求用計算機求解數獨。輸入描述 輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的數字。輸出描述 輸出九行,每行九個...