第 74 講:算法源代碼
下面列舉在前文提到或使用到的一些算法源代碼。
Part 1?回溯法算法代碼
由于回溯是相對(duì)比較簡(jiǎn)單的算法,所以我們使用C語(yǔ)言進(jìn)行描述。它的代碼如下。
測(cè)試的結(jié)果如下。

可以從思路上發(fā)現(xiàn),回溯法無(wú)法驗(yàn)證題目的唯一性,但它可以驗(yàn)證題目是否有解。如果題目無(wú)解,則沒(méi)有任何的結(jié)論的輸出;但如果有解,它就會(huì)嘗試輸出一個(gè)解,并退出程序(不過(guò)你可以考慮更改“n == 81”條件內(nèi)執(zhí)行的語(yǔ)句來(lái)更改得到解時(shí)候的執(zhí)行邏輯。
不過(guò)由于C語(yǔ)言不支持異常,所以我們無(wú)法控制輸出固定個(gè)數(shù)解的操作。不過(guò)在其它的高級(jí)編程語(yǔ)言里,我們可以采用異常機(jī)制,當(dāng)輸出的解的總數(shù)超出一定限度的時(shí)候,讓該遞歸函數(shù)拋出遞歸跳出的異常(例如Java的InterruptedException)來(lái)跳出執(zhí)行。
Part 2 舞蹈鏈算法代碼
這里列出舞蹈鏈算法的源代碼,為了思路更為清晰,此處將使用C#語(yǔ)言描述。
2-1?數(shù)據(jù)節(jié)點(diǎn)文件(DataNode.cs)
2-2 列節(jié)點(diǎn)文件(ColumnNode.cs)
2-3?舞蹈鏈文件(DancingLink.cs)
2-4?矩陣行節(jié)點(diǎn)文件(DancingLink.MatrixRow.cs)
2-5 解題器對(duì)象(DancingLinksSolver.cs)
2-6?主方法調(diào)用(Program.cs)
Part 3?Linq解法算法代碼
在數(shù)獨(dú)里,我們甚至可以使用Linq輕松完成一個(gè)題目的解題,而且比純回溯要更快一些。我們可以嘗試使用Linq自帶的查詢(xún)和替代功能,為一個(gè)數(shù)獨(dú)盤(pán)面(字符串形式)進(jìn)行解題。代碼如下(使用C# 8提供的語(yǔ)法)。
可以從代碼里看出,實(shí)際上它就是在不斷替換字符為0(0表示空格)的地方,然后得解的操作。