解數獨,理解二維遞迴是關鍵!編寫乙個程式,通過填充空格來解決數獨問題。
乙個數獨的解法需遵循如下規則:
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。
空白格用 '.' 表示。
乙個數獨。
答案被標成紅色。
棋盤搜尋問題可以使用回溯法暴力搜尋,只不過這次我們要做的是「二維遞迴」。
怎麼做二維遞迴呢?
大家已經跟著「**隨想錄」刷過了如下回溯法題目,例如:77.組合(組合問題),131.分割回文串(分割問題),78.子集(子集問題),46.全排列(排列問題),以及51.n皇后(n皇后問題),其實這些題目都是一維遞迴。
經典面試題目「回溯演算法」n皇后問題 是因為每一行每一列只放乙個皇后,只需要一層for迴圈遍歷一行,遞迴來來遍歷列,然後一行一列確定皇后的唯一位置。
本題就不一樣了,「本題中棋盤的每乙個位置都要放乙個數字,並檢查數字是否合法,解數獨的樹形結構要比n皇后更寬更深」。
因為這個樹形結構太大了,我抽取一部分,如圖所示:
「遞迴函式的返回值需要是bool型別,為什麼呢?」
因為解數獨找到乙個符合的條件(就在樹的葉子節點上)立刻就返回,相當於找從根節點到葉子節點一條唯一路徑,所以需要使用bool返回值,這一點在回溯演算法:n皇后問題中已經介紹過了,一樣的道理。
**如下:
bool backtracking(vector>& board)
本題遞迴不用終止條件,解數獨是要遍歷整個樹形結構尋找可能的葉子節點就立刻返回。
「不用終止條件會不會死迴圈?」
「那麼有沒有永遠填不滿的情況呢?」
這個問題我在遞迴單層搜尋邏輯裡在來講!
在樹形圖中可以看出我們需要的是乙個二維遞迴(也就是兩個for迴圈巢狀著遞迴)
「乙個for迴圈遍歷棋盤的行,乙個for迴圈遍歷棋盤的列,一行一列確定下來之後,遞迴遍歷這個位置放9個數字的可能性!」
**如下:(「詳細看注釋」)
bool backtracking(vector>& board) };
解數獨可以說是非常難的題目了,如果還一直停留在單層遞迴的邏輯中,這道題目可以讓大家瞬間崩潰。
所以我在開篇就提到了「二維遞迴」,這也是我自創詞彙,希望可以幫助大家理解解數獨的搜尋過程。
一波分析之後,在看**會發現其實也不難,唯一難點就是理解「二維遞迴」的思維邏輯。
「這樣,解數獨這麼難的問題,也被我們攻克了」。
「恭喜一路上堅持打卡的錄友們,回溯演算法已經接近尾聲了,接下來就是要一波總結了」。
python經典面試題目
print set a set b a,b中相同的元素 print set a set b a,b中不同元素list 1 a b c b a list 1 list set list 1 print list 1 alist defsort by age alist return sorted al...
經典C 面試題目
1 在c 中,string str null 與 string str 請盡量使用文字或圖象說明其中的區別。回答要點 說明詳細的空間分配。10分 答 string str null 是不給他分配記憶體空間,而string str 給它分配長度為空字串的記憶體空間.請詳述在dotnet中類 class...
面試題 1,2,2,3,4,5全排列問題
題目 思路 從最小值到最大值進行遍歷,排查,篩選出符合條件的數字 public class text04 規定範圍之內的數字 static string yes newstring public static void main string args system.out.println coun...