這是使用物件導向程式設計來求解數獨的程式庫
房子區塊群組類別
參數: |
|
---|
註解
這將取代母類別,GroupBase,的 init()
如果在一個區塊群組中所有尚未被給填上的代碼, num, 其可能填上此 num 的 Point 物件有同樣的 x 軸或 y 軸座標時, 我們稱為 Group Numer。
參數: |
|
---|---|
返回: | GroupNumber, None或者是一個 GroupNumber 物件 |
一個鏈結(chain)是由同個群組中2個以上的空白點組合起來,在這些點上的可被填上的代碼總數剛好等於這些點數,所以在同個群組中的其他空白點就不可能被填上這個鏈結上的所有代碼。
參數: |
|
---|
所有群組類別(包含 x 軸, y 軸, 區塊等群組)的基本類別
基本群組類別的起始函數(init())
參數: |
|
---|
取得這個群組中所有空白點列表,而且可被填寫的數字僅存於 [count] 個點上。
註解
輸出為一個 tuple 列表,這個 tuple包含兩個值,一個是數字,另一個是 Point 物件列表
參數: | count – int, 要取得的點數 |
---|---|
返回: | list, 格式為 [(num,[p1, p2...]),...] |
在這個群組中取得 Point 物件列表
參數: |
|
---|---|
返回: | list: 一個 Point 物件列表 |
在區塊群組中的 Group Number
參數: |
|
---|
x 軸線群組
基本群組類別的起始函數(init())
參數: |
|
---|
y 軸線群組
基本群組類別的起始函數(init())
參數: |
|
---|
數獨遊戲的整體物件
參數: | file – file, 數獨遊戲的初始設定檔案 |
---|
屬性:
rec: 格式為 [(x, y, v, t, d),...], 求解紀錄列表
filled: int, 已被填寫的點數
done: bool, 是否已解
error: bool, 是否發生錯誤
lineX: x 軸線群組物件列表
lineY: y 軸線群組物件列表
b: 區塊群組物件列表
p: 一個二階陣列的點列表
n: 數字物件列表
chain: 鏈結(chain)物件列表
檢查座標為 (x, y) 的點(Point)物件能否填入數字 v
參數: |
|
---|---|
返回: | 「是」或「非」 |
取得能看的見某點(p)的所有 Point 物件列表
參數: |
|
---|---|
返回: | Point 物件列表 |
取得所有 Point 物件列表, 藉由呼叫 GroupBase.get_all_pos() 來取得
參數: |
|
---|---|
返回: | Point 物件列表 |
在座標為 (x, y) 點中可被填寫的數字列表上, 去掉這個數字, v
參數: |
|
---|---|
返回: | int, 如下面說明 |
2: 如果設定了一個數字
1: 如果只是消減一個數字
0: 無法消減該數,如果 check 是 True 時,就會啟動 SudokuError 這個例外處理
數字物件
註解
你可以想像這個類別的物件唯一個國家,而每個國家有其代碼,從 1 到 9 。
參數: | v – int, 此物件的代碼, 從 1 到 9 |
---|
在數獨表中的一個點
註解
你能夠想像每一個點物件是一間房子
這是點(Point)物件的起始程式(init())
參數: |
|
---|
求解法物件
參數: |
|
---|
執行一個求解法來解開一個數獨遊戲
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
儲存執行狀態
MethodLoopIdx: | int, 求解周期索引數 |
---|---|
MethodIdx: | int, 目前使用的求解法索引數 |
CheckPos: | Point list, (x, y)座標列表,如果設定這個 list, 當其中之一被設定時,系統就停止處理 |
WriteDownAlready: | |
bool, 是否空白點已被模擬寫下它們可被填上的數 |
|
EmulatePossibles: | |
int, 使用模擬法時的可能數限制, 包括可能點數或數字數 |
|
TryStack: | 格式為 [(m, x, y, idx),...] 的列表 |
m: Matrix 物件, 在 (x, y) 點被設定為第 idx 可能數之前,將其備份起來,以便能夠回復
x: int, 要嘗試的 x 座標
y: int, 要嘗試的 y 座標
idx: int, 可能數的索引值,由 0 開始起始
TryIdx: | int, 猜測深度索引值,也就是已經是以猜測法來解時,這是第幾次使用此法了 |
---|---|
TryUse: | bool, 是否要使用猜測法 |
EmuUse: | bool, 是否要使用模擬法 |
Scope: | int, 此數獨的困難度 |
Level: | int, 使用求解法困難度的限制,0: 表示不限制 |
Original: | Matrix, 初始化的 Matrix 物件 |
Result: | Matrix, 目前的數獨物件 |
PrintSteop: | bool, 是否要列印求解步驟 |
NowPath: | str, 目前的工作目錄 |
一個例外處理,當數獨遊戲中每個點都被填滿時產生
參數: |
|
---|
一個例外處理,當一個點無法被設定或減掉某個數字(v)時而產生, 其中 type 為 s 表示為設定動作, r 表示為減掉動作
參數: |
|
---|
一個例外處理, 當一個座標列表, [(x1, y1), ...], checkPos 有設定時, 這些點中如有被設定時, 就會引發此事件的處理
參數: |
|
---|
檢查每一個數字,從它們已被填寫的所在的位置與已發現的 Group Numer交叉影響下、那些尚未有該數字的區塊群組中,是否可以找到僅剩一個點來給予這個數字,如果是,則可以很明顯地此此點填上這個數字
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
檢查每一個 x 軸或 y 軸線群組,是否只剩一個點能夠填上某個數字
參數: | m – 數獨世界整體物件 |
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
檢查每一個數字,從它們已被填寫的所在的位置交叉影響下、那些尚未有該數字的區塊群組中,是否可以找到僅剩一個點來給予這個數字,如果是,則可以很明顯地此此點填上這個數字
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
比較所有的結果列表,比較每個列表從原本最後一筆紀錄之後的行動紀錄,如果有相同者,則表示每一種狀況都會導致這個結果,那此行動就應該是符合邏輯的,可以照做無誤
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces), sets: 設定的總數, reduces: 削減可能性的總數 |
以猜測法將座標 (x, y) 的點設為數字 v,然後再開始使用一些基本求解法其求解, 直到有其下狀況發生時才停止並返回:
1: 當 targets 座標列表中的一點被設定為 checkval 這個數時
2: 已經解開了此數獨
-1: 如果破壞了數獨規則時
0: 所有的基本求解法都嘗試過了,但還是無法得解
及模擬後的結果Matrix物件
參數: |
|
---|---|
返回: | tuple, 格式為 (rtn, matrix, idx) |
1: 當 targets 座標列表中的一點被設定為 checkval 這個數時
2: 已經解開了此數獨
-1: 如果破壞了數獨規則時
0: 所有的基本求解法都嘗試過了,但還是無法得解
matrix: 模擬結果的 Matrix 物件
idx: int, 如果 rtn == 1 時, 此索引值將指出是哪一個點被設定為 checkval 這個數
當一個數字被設定在一個點上時,可能會造成 1 到 3 個群組只剩一個空白點,這裡就會檢查是否此狀況,如果有,則直接設定它,如同人的基本直覺一樣。
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
假如在一群組(線或區塊)中只剩一個空白點時
參數: | m – 數獨遊戲整體物件 |
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
檢查每一個空白點,看是否在可能的數字列表中只剩一個。
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
從空白點列表(pos)中取得哪些數字形成了鍵結(chain)
參數: |
|
---|---|
返回: | 鍵結(chain)列表 |
以每個點剩下可填入的數字列表中,一一去猜測那一個數字可以求得數獨的解,猜測的點由最可填入的數字數從小排到大
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
當一個點(p1)有兩個或以上的可能數時,我們可以模擬每個數字,並取得其模擬結果:
假如它會產生錯誤,那我們可以消減掉那個數
假如它能夠解開整個數獨,那我們就可以設定這個數字
使如所有的數都不能得到 1 或 2 的結果,我們可以比較這些模擬的求解過程,如果有它們都有相同的求解結果時,那表示這個步驟是個通解。
參數: | m – 數獨世界整體物件 |
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
當一個群組(x 軸、y 軸、區塊)有兩個或以上的點能夠被填上某個特定的數字時,我們可以模擬每個點填上該數字後來取得此模擬結果:
假如產生錯誤時,我們可以將此點中的可能數中消除掉此數
假如能夠解開這個數獨時,我們就可以在此點設定此數
假如所有的點都不能得到 1 或 2 的結果,我們可以比較每個位置模擬的結果,如果他們有共通的求解結果,那表示那個動作是一個通解
參數: | m – 數獨世界整體物件 |
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
以 Group Number 來消減其他點的可能數
參數: | m – 數獨世界整體物件 |
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
當一個點(p1)只有兩個能數時,我們可以先假設這個點其中一數(設為first),然後將此點設為另外一數(設為second)來模擬f求解,看這求解過程中,first這個數落在哪些點上,那對所落的點與p1有所交集(兩個點都能看見)的空白點而言,都不可能存在填入first這個數的可能,而可以讓這些點將這個可能數消除。
參數: | m – 數獨世界整體物件 |
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
當某(p1)點能夠以某求解法取得解答時,檢查此點是否能夠以更直覺的方法來設定,以便符合以人的角度來求解數獨
參數: |
|
---|---|
返回: | True: 已設定, False: 未設定 |
解一個定義於檔案的數獨!
參數: |
|
---|---|
Raises: |
|
返回: | 數獨世界整體物件 |
電腦嘗試錯誤求解法,每一次呼叫只填第一個位置
參數: |
|
---|---|
返回: | bool, True: 如果這個數獨已經得解 |
檢查與更新 Matrix 物件(m)的鏈結狀況與資訊,並取得鏈節總數(>= 0)。
參數: | m – 數獨世界整體物件 |
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
檢查與更新這個數(num)在 Matrix 物件(m)是否有 Group Numbe,若有新的則更加至 m.n.group 列表
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
一個遞迴函數,由已填在位置上的某數及其已知的 Group Number 遞迴地呼叫自己來找出此數所有其他可能的 Group Number
參數: |
|
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎
如果常數 WRITEN_POSSIBLE_LIMITS 設定為 1..9 時,則表示要像人一樣將每個點的可能數 <= WRITEN_POSSIBLE_LIMITS 都寫在點上,讓人可以看出這些數的關聯而繼續求解
參數: | m – 數獨世界整體物件 |
---|---|
返回: | tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下: |
sets: int, 設定了多少點
reduces: int, 削減了多少點
mothod index: int, 返回後要跳到哪一個求解法
first: int, 返回後要讓其他求解法從哪一個數字開始解
only: bool, 返回後要讓其他求解法址只解第一個數字嗎