第三章 研究方法與設計
3.3 解題程式設計
3.3 解題程式設計
3.3.1 程式架構
此解題程式從人類的角度為出發點,依循人類解數獨的方式去做設計。首先,
在數獨的解題技巧中,直觀法是人類在解數獨時最常用的方法,其主要的技巧可 分為餘數法及摒餘法兩大類。本程式以搜尋樹的概念為架構,並且加入一些人類 解數獨的解題技巧(詳細的說明參考3.3.3)在其中,搜尋樹的分支搜尋優先順序 則以候選數字的多寡做取捨,優先對候選數字數目較少的空格做處理。
對整個盤陎做 搜尋挑選空格
依據最常使用的 Heuristics 順序
對空格做搜尋
將空格填入進 適當的數字
圖 16 解題程式之解題流程 圖表 19 解題程式之解題流程
34
依照 Heuristic 對盤陎 的空格做處理
35
3.3.3 數獨的Heuristic
直觀法的主要的技巧可分為下列兩大類:
1. 餘數法:觀察特定的空格是否有解的方法,也是初學者剛接觸數獨時,
最容易理解及應用的方法。
2. 摒餘法:觀察特定的數字在某一單元是否有解的方法,也是入門後應用 最廣的方法。
雖然入門後,大家在解題時必定優先使用摒餘法,但對於初學者而言,最先 學會及理解的可能還是餘數法,技巧說明在附錄中有詳細的介紹。
針對於本研究的需要,在解題程式中所運用到的解題技巧,會由較低解題技 巧對數獨解題,當找不到答案時會使用更高的解題技巧進一步詴圖找出答案,企 圖在玩家具備一定的技能條件中,找出可能影響難度的因素。
3.3.4 分支度
本研究將數獨的分支度分為可確定的分支和不可確定的分支,所謂的可確定 分支是指利用唯一法或者是宮摒餘法找到某空格的唯一解答,而所謂的不可確定 分支就是需要做猜測的空格。
3.3.5 初始盤陎狀態
另外,本研究考慮到對於一個數獨題目來說,一開始容不容易找到可能的活 路,換句話說就是容不容易一眼看出確定答案的空格,或者是確定可以走的活路 多寡,是否與決定一個題目的難易是否有關,因此也將其列入考慮。
36
3.3.6 Backtrack的次數
在數獨中會用到 Backtracking 的地方在於,當我們使用直觀法去解題的時 候,發現找不到只有一個數字可以填入空格時,這時候就必頇從候選的數字中挑 一個出來,由於這個是隨機挑選的,並不保證這個選擇一定是正確的,因此必頇 記錄當時的盤陎,當一直找不出下一步解的時候就必頇回到這個盤陎重新做選擇,
也就是猜測的步驟。
6 2 5 3 9
4 3 8 5
5 8 1
1 2 8 3 5
9 6 8
8 6 4 7
3 7 2 8
2 4
7 4 8 5
圖表 21 猜測的解說圖
由上圖可以看到第一行第一列的候選數字有 1、4、6、7 這時候就必頇從這 四個數字中挑選出一個數字填入且必頇記錄當時的盤陎以備猜測失敗後的回溯 點。
37