上一個主題

撰寫 Python 程式來解數獨了

本頁

程式詳解: sudoku套件

這是使用物件導向程式設計來求解數獨的程式庫

class sudoku.sudoku.Box(idx, p)[source]

房子區塊群組類別

參數:
  • idx – int, 此群組的代碼
  • p – 此群組所屬的 Point 物件列表

註解

這將取代母類別,GroupBase,的 init()

get_group_number(num, pos=, []notInLineX=None, notInLineY=None)[source]

如果在一個區塊群組中所有尚未被給填上的代碼, num, 其可能填上此 num 的 Point 物件有同樣的 x 軸或 y 軸座標時, 我們稱為 Group Numer。

參數:
  • num – int, 要尋找的代碼, 它是這個區塊群組的的 Group Number
  • pos – list, 一個 Point 物件列表,從中來尋找出 Group Number,如果是空白,則函數會取得區塊物件所有空白的 Point 物件。
  • notInLineX – bool, 呼叫 get_all_pos() 時,設定包含或不包含 x 軸的空白點。
  • notInLineY – bool, 呼叫 get_all_pos() 時,設定包含或不包含 y 軸的空白點。
返回:

GroupNumber, None或者是一個 GroupNumber 物件

class sudoku.sudoku.Chain(numList, posList)[source]

一個鏈結(chain)是由同個群組中2個以上的空白點組合起來,在這些點上的可被填上的代碼總數剛好等於這些點數,所以在同個群組中的其他空白點就不可能被填上這個鏈結上的所有代碼。

參數:
  • numList – int list, 代表這個鏈結的所有代碼列表
  • posList – Point list, 代表這個連結上所有空白點的列表
class sudoku.sudoku.GroupBase(idx, p)[source]

所有群組類別(包含 x 軸, y 軸, 區塊等群組)的基本類別

基本群組類別的起始函數(init())

參數:
  • idx – int, 這個物件的代碼
  • p – 所屬這個物件的 Point 物件列表
allow(v)[source]

檢查這個群組物件是否能夠被填上此代碼(v)?

參數:v – int,要被檢查的代碼
返回:「是」或「非」
count_num_possible(count=1)[source]

取得這個群組中所有空白點列表,而且可被填寫的數字僅存於 [count] 個點上。

註解

輸出為一個 tuple 列表,這個 tuple包含兩個值,一個是數字,另一個是 Point 物件列表

參數:count – int, 要取得的點數
返回:list, 格式為 [(num,[p1, p2...]),...]
get_all_pos(diff=, []method='a', num=0, notInLineX=None, notInLineY=None, chain=None, possibles=None)[source]

在這個群組中取得 Point 物件列表

參數:
  • diff – list, 要排除點的列癟
  • method – char, a: 全部, s:非空白, u:空白
  • num – int, 假如 method 是 u 時, 且此參數設為 1-9, 那就會取得可以容納此數字的所有空白點
  • notInLineX – bool, 包含或不包含 x 軸的點
  • notInLineY – bool, 包含或不包含 y 軸的點
  • chain – bool, 如果有設定此參數則檢查是要取得 chain 的點或者不是 chain 的點
  • possibles – int, 如果 method=”u” 且 possibles!=None, 將只取得可填寫數字總數為 possibles 的點
返回:

list: 一個 Point 物件列表

get_num_pos(v)[source]

在一個群組中取得被填寫數字為 v 的點

參數:v – int, 想要取得點的數字
返回:None 或者是一個 Point 物件
class sudoku.sudoku.GroupNumber(b, num, p, direction, idx)[source]

在區塊群組中的 Group Number

參數:
  • b – int, 區塊群組的代碼
  • num – int, 此物件被填入的數字
  • p – Point List, 形成這個 Group Number 的 Point 物件列表
  • direction – char, 值為 “x” 或 “y”, 代表這個 Group Number 的方向
  • idx – int, 這個 x 軸或 y 軸線群組的代碼
class sudoku.sudoku.LineX(idx, p)[source]

x 軸線群組

基本群組類別的起始函數(init())

參數:
  • idx – int, 這個物件的代碼
  • p – 所屬這個物件的 Point 物件列表
class sudoku.sudoku.LineY(idx, p)[source]

y 軸線群組

基本群組類別的起始函數(init())

參數:
  • idx – int, 這個物件的代碼
  • p – 所屬這個物件的 Point 物件列表
class sudoku.sudoku.Matrix(file='')[source]

數獨遊戲的整體物件

參數:file – file, 數獨遊戲的初始設定檔案

屬性:

  • rec: 格式為 [(x, y, v, t, d),...], 求解紀錄列表

  • filled: int, 已被填寫的點數

  • done: bool, 是否已解

  • error: bool, 是否發生錯誤

  • lineX: x 軸線群組物件列表

  • lineY: y 軸線群組物件列表

  • b: 區塊群組物件列表

  • p: 一個二階陣列的點列表

  • n: 數字物件列表

  • chain: 鏈結(chain)物件列表

allow(x, y, v)[source]

檢查座標為 (x, y) 的點(Point)物件能否填入數字 v

參數:
  • x – int, x 座標
  • y – int, y 座標
  • v – int, 要填入的數字
返回:

「是」或「非」

can_see(p0, method='u', num=0)[source]

取得能看的見某點(p)的所有 Point 物件列表

參數:
  • method – char, “u”: 空白點, “a”: 全部, “s”: 非空白點
  • num – 如果 method==”u” 時,取得的點必須能夠被填入這個數字: number
返回:

Point 物件列表

get_all_pos(diff=, []method='a', num=0, chain=None, possibles=None)[source]

取得所有 Point 物件列表, 藉由呼叫 GroupBase.get_all_pos() 來取得

參數:
  • diff – Point 物件列表,排除這些列表上的點
  • method – char, “a” – 全部l, “u” – 空白點, “s” – 非空白點
  • num – int, 取得的空白點中必須能夠被填上 [num] 這個數字
  • chain – bool, 如果有設定此參數則檢查是要取得 chain 的點或者不是 chain 的點
  • possibles – int, 假如有設定此參數,將只取得可填寫數字總數為 possibles 的點
返回:

Point 物件列表

print_rec()[source]

列印所有的求解過程

read(file)[source]

讀取數獨遊戲的定義檔

參數:file – file, 數獨定義檔案,你可以給予絕對的檔案位址,如果只有給予檔名,系統將到安裝目錄下的 data 中去取得檔案
reduce(x, y, v, d='set', check=False, info='')[source]

在座標為 (x, y) 點中可被填寫的數字列表上, 去掉這個數字, v

參數:
  • x – int, x 座標
  • y – int, y 座標
  • v – int, 要被去掉可能性的數字
  • d – str, 得到解答的說明
  • check – bool, 是否要檢查
  • info – str, 得到解答的詳細說明
返回:

int, 如下面說明

  • 2: 如果設定了一個數字

  • 1: 如果只是消減一個數字

  • 0: 無法消減該數,如果 check 是 True 時,就會啟動 SudokuError 這個例外處理

setit(x, y, v, d='define', info='')[source]

設定座標 (x, y) 點物件的數值為 v

參數:
  • x – int, x 座標
  • y – int, y 座標
  • v – int, 要設定的數字
  • d – str, 得到解答的說明
  • info – str, 得到解答的詳細說明
返回:

int, >=1: 如果設定成功的話, 0: 如果不成功

sort_unassigned_pos_by_possibles(possibles=0)[source]

取得一個群組中的空白點列表,格式為[p1, p2,...],且以允許填寫的數字總數從低排到高

參數:possibles – 0: 則取得全部, >=0: 則只取得允許數字總數為此數的空白點列表
返回:Point 物件列表
class sudoku.sudoku.Number(v)[source]

數字物件

註解

你可以想像這個類別的物件唯一個國家,而每個國家有其代碼,從 1 到 9 。

參數:v – int, 此物件的代碼, 從 1 到 9
can_see_by_group_number(p1)[source]

檢查這個點, p1, 是否能夠讓這個數字(number)的 Group Number 看到

參數:p1 – Point, 一個點物件
返回:如果可以被看見則取得該 Group Number 物件,否則為 None
setit(p1)[source]

儲存所有非空白的點到 p 這個列表

參數:p1 – Point, 一個被歸屬到這個物件的點物件
class sudoku.sudoku.Point(x, y)[source]

在數獨表中的一個點

註解

你能夠想像每一個點物件是一間房子

這是點(Point)物件的起始程式(init())

參數:
  • x – int, 這個物件的 x 座標
  • y – int, 這個物件的 y 座標
can_see(p1)[source]

測試這個點物件是否能夠看見另外一個點(p1)?

參數:p1 – Point, 一個點物件
返回:int, 這個值不能為 3 或 7,這代表同個點

返回碼:

  • 0: 不能看見 p1 點

  • 1: 能夠在 x 軸看見它

  • 2: 能夠在 y 軸看見它

  • 能夠在區塊群組看見它

can_see_those(posList)[source]

測試這個點能看的見一個點列表(posList)中的哪些點

參數:posList – list, 列表格式為 [(x, y),...]
返回:list, 列表格式為 [(x, y),...]
class sudoku.sudoku.SolveMethod(fun, idx, name='', level=0, obvious=True)[source]

求解法物件

參數:
  • fun – function, 定義在 Python 程式中的涵數名稱
  • idx – int, 執行的修先順序
  • name – str, 此求解法的名稱
  • level – int, 此求解法的困難程度,值越大越困難
  • obvious – bool, 對人而言是否為直覺的方法,也就是使用眼睛觀察即可
run(m, *args, **ks)[source]

執行一個求解法來解開一個數獨遊戲

參數:
  • m – 數獨世界整體物件
  • ks – first(int): 起始數字(int), only(bool): 只檢查一個數
返回:

tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:

  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

class sudoku.sudoku.Status[source]

儲存執行狀態

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, 目前的工作目錄

exception sudoku.sudoku.SudokuDone(x, y, v)[source]

一個例外處理,當數獨遊戲中每個點都被填滿時產生

參數:
  • x – int, 當解完數獨時,最後一個點的 x 座標
  • y – int, 當解完數獨時,最後一個點的 y 座標
  • v – int, 當解完數獨時,最後一個點被填上的數字
exception sudoku.sudoku.SudokuError(x, y, v, t)[source]

一個例外處理,當一個點無法被設定或減掉某個數字(v)時而產生, 其中 type 為 s 表示為設定動作, r 表示為減掉動作

參數:
  • x – int, 發生規則錯誤時的 x 座標
  • y – int, 發生規則錯誤時的 y 座標
  • v – int, 發生規則錯誤時所要設定或減掉的數字
  • t – char, “s” – 設定動作, “r” – 減掉動作
exception sudoku.sudoku.SudokuStop[source]

一個例外處理, 當求解紀錄達到 recLimit 時 (除錯時用)

exception sudoku.sudoku.SudokuWhenPosSet(x, y, v)[source]

一個例外處理, 當一個座標列表, [(x1, y1), ...], checkPos 有設定時, 這些點中如有被設定時, 就會引發此事件的處理

參數:
  • x – int, 當要檢查的點被設定時的 x 座標
  • y – int, 當要檢查的點被設定時的 y 座標
  • v – int, 當要檢查的點被設定時, 所設定數字
sudoku.sudoku.check_inobvious_number(m, first=1, only=False)[source]

檢查每一個數字,從它們已被填寫的所在的位置與已發現的 Group Numer交叉影響下、那些尚未有該數字的區塊群組中,是否可以找到僅剩一個點來給予這個數字,如果是,則可以很明顯地此此點填上這個數字

參數:
  • m – 數獨世界整體物件
  • first – 要被檢查的第一個數字
  • only – bool, False: 檢查所有數字, True: 只檢查第一個數字
返回:

tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:

  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.check_line_last_possible_for_number(m, **kw)[source]

檢查每一個 x 軸或 y 軸線群組,是否只剩一個點能夠填上某個數字

參數:m – 數獨世界整體物件
返回:tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:
  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.check_obvious_number(m, first=1, only=False)[source]

檢查每一個數字,從它們已被填寫的所在的位置交叉影響下、那些尚未有該數字的區塊群組中,是否可以找到僅剩一個點來給予這個數字,如果是,則可以很明顯地此此點填上這個數字

參數:
  • m – 數獨世界整體物件
  • first – 要被檢查的第一個數字
  • only – False: 檢查所有數字, True: 只檢查第一個數字
返回:

tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:

  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.compare_result(m, emu, result)[source]

比較所有的結果列表,比較每個列表從原本最後一筆紀錄之後的行動紀錄,如果有相同者,則表示每一種狀況都會導致這個結果,那此行動就應該是符合邏輯的,可以照做無誤

參數:
  • m – 數獨世界整體物件
  • emu – 一個二階列表,格式為 [[Point, Assigned Number],...]
  • result – Matrix 物件列表, 每一個的 Matrix 物件代表一個模擬結果
返回:

tuple, 格式為 (sets, reduces), sets: 設定的總數, reduces: 削減可能性的總數

sudoku.sudoku.emulator(m, x, y, v, targets=, []checkval=0)[source]

以猜測法將座標 (x, y) 的點設為數字 v,然後再開始使用一些基本求解法其求解, 直到有其下狀況發生時才停止並返回:

  • 1: 當 targets 座標列表中的一點被設定為 checkval 這個數時

  • 2: 已經解開了此數獨

  • -1: 如果破壞了數獨規則時

  • 0: 所有的基本求解法都嘗試過了,但還是無法得解

及模擬後的結果Matrix物件

參數:
  • m – 數獨世界整體物件
  • x – int, 起始的 x 座標
  • y – int, 起始的 y 座標
  • v – int, 座標 (x, y) 的點要被模擬設定的數字
  • targets – Point list, 要被檢查的點列表
  • checkval – int, 如果已設定了 targets, 則要設定此參數,以便檢查被設定的數字
返回:

tuple, 格式為 (rtn, matrix, idx)

  • rtn:
    • 1: 當 targets 座標列表中的一點被設定為 checkval 這個數時

    • 2: 已經解開了此數獨

    • -1: 如果破壞了數獨規則時

    • 0: 所有的基本求解法都嘗試過了,但還是無法得解

  • matrix: 模擬結果的 Matrix 物件

  • idx: int, 如果 rtn == 1 時, 此索引值將指出是哪一個點被設定為 checkval 這個數

sudoku.sudoku.fill_last_position_by_setting(m, sets)[source]

當一個數字被設定在一個點上時,可能會造成 1 到 3 個群組只剩一個空白點,這裡就會檢查是否此狀況,如果有,則直接設定它,如同人的基本直覺一樣。

參數:
  • m – 數獨遊戲整體物件
  • sets – int, 最後多少筆的設定要檢查
返回:

tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:

  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.fill_last_position_of_group(m, **kw)[source]

假如在一群組(線或區塊)中只剩一個空白點時

參數:m – 數獨遊戲整體物件
返回:tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:
  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.fill_only_one_possible(m, **kw)[source]

檢查每一個空白點,看是否在可能的數字列表中只剩一個。

參數:
  • m – 數獨遊戲整體物件
  • first – int, 第一個要被檢查的數字
  • only – bool, 只檢查第一個數字或者全部
返回:

tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:

  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.get_chains(m, group, pos, numbers)[source]

從空白點列表(pos)中取得哪些數字形成了鍵結(chain)

參數:
  • m – 數獨世界整體物件
  • group – x 軸或 y 軸或區塊物件
  • pos – 一個群組的點物件列表
  • numbers – int, 形成一個鍵結(chain)的點數
返回:

鍵結(chain)列表

sudoku.sudoku.guess(m, idx=0, **kw)[source]

以每個點剩下可填入的數字列表中,一一去猜測那一個數字可以求得數獨的解,猜測的點由最可填入的數字數從小排到大

參數:
  • m – 數獨世界整體物件
  • idx – int, 0: 表示新的一次猜測, 其他: 則表示此次猜測是這個點可能數的第幾個
返回:

tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:

  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.reduce_by_emulate_possible_in_one_position(m, **kw)[source]

當一個點(p1)有兩個或以上的可能數時,我們可以模擬每個數字,並取得其模擬結果:

  • 假如它會產生錯誤,那我們可以消減掉那個數

  • 假如它能夠解開整個數獨,那我們就可以設定這個數字

  • 使如所有的數都不能得到 1 或 2 的結果,我們可以比較這些模擬的求解過程,如果有它們都有相同的求解結果時,那表示這個步驟是個通解。

參數:m – 數獨世界整體物件
返回:tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:
  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.reduce_by_emulate_possible_number_in_group(m, **kw)[source]

當一個群組(x 軸、y 軸、區塊)有兩個或以上的點能夠被填上某個特定的數字時,我們可以模擬每個點填上該數字後來取得此模擬結果:

  • 假如產生錯誤時,我們可以將此點中的可能數中消除掉此數

  • 假如能夠解開這個數獨時,我們就可以在此點設定此數

  • 假如所有的點都不能得到 1 或 2 的結果,我們可以比較每個位置模擬的結果,如果他們有共通的求解結果,那表示那個動作是一個通解

參數:m – 數獨世界整體物件
返回:tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:
  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.reduce_by_group_number(m, first=1, only=False)[source]

以 Group Number 來消減其他點的可能數

參數:m – 數獨世界整體物件
返回:tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:
  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.reduce_by_two_possible_in_one_position(m, **kw)[source]

當一個點(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, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.reg_method()[source]

註冊所有求解法為一個個物件並儲存成一個列表送回給呼叫者

返回:求解法物件列表
sudoku.sudoku.set_obvious_method_for_pos(m, method1, p1, v)[source]

當某(p1)點能夠以某求解法取得解答時,檢查此點是否能夠以更直覺的方法來設定,以便符合以人的角度來求解數獨

參數:
  • m – 數獨世界整體物件
  • method1 – int, 求解法優先序
  • p1 – Point, 要檢查的點
  • v – int, 要被設定的數
返回:

True: 已設定, False: 未設定

sudoku.sudoku.solve(file, loop_limit=0, rec_limit=0, check=None, level_limit=0, emu_limits=2, use_try=True, use_emu=False, print_step=False)[source]

解一個定義於檔案的數獨!

參數:
  • loop_limit – int, 限制求解法的重複次數, 0: 沒有限制
  • rec_limit – int, 除錯用, 若求解紀錄 >= recLimit 時就停止,0: 沒有限制
  • check – int, 除錯用, 如果一個座標 (x, y) 列表中其中的一點被設定時,則停止
  • level_limit – int, limit the methods using, 0: no limit, >0: just using the methods which lever < level_limit
  • emu_limits – imt, 如果使用模擬法,則此參數定義模擬的可能數限制
  • use_try – bool, 是否使用猜測法
  • use_emu – bool, 是否使用模擬法
  • print_step – bool, 是否在求解過程中列印信息
Raises:
  • SudokuDone – 當一個求解法可以解開這個數獨時
  • SudokuError – 當一個求解步驟會違反數獨的規則時
返回:

數獨世界整體物件

sudoku.sudoku.try_error(m=None, file='', depth=0)[source]

電腦嘗試錯誤求解法,每一次呼叫只填第一個位置

參數:
  • m – Matrix 物件, 如果值為 None, 你必須給予數獨定義檔來產生 Matrix 初始物件
  • file – file, 數獨初始定義檔
  • depth – int, 計數這個函數已經遞迴多少深度了
返回:

bool, True: 如果這個數獨已經得解

sudoku.sudoku.update_chain(m, **kw)[source]

檢查與更新 Matrix 物件(m)的鏈結狀況與資訊,並取得鏈節總數(>= 0)。

參數:m – 數獨世界整體物件
返回:tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:
  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.update_group_number(m, num)[source]

檢查與更新這個數(num)在 Matrix 物件(m)是否有 Group Numbe,若有新的則更加至 m.n.group 列表

參數:
  • m – 數獨世界整體物件
  • num – 要被更新的數字
返回:

tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:

  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.update_indirect_group_number(m, num, amt=0, start=0, first=1, only=False)[source]

一個遞迴函數,由已填在位置上的某數及其已知的 Group Number 遞迴地呼叫自己來找出此數所有其他可能的 Group Number

參數:
  • m – 數獨世界整體物件
  • num – int,要被檢查的代碼
  • amt – int, 找到的 Group Number 總數
  • start – int, 當此求解法有用時,解後要跳到哪一個求解法來繼續
  • first – int, 當此求解法有用時,解後是否要指定某數當作其他求解法的起始數
  • only – bool, 當此求解法有用時,解後是否要讓其他求解法只針對某數來求解
返回:

tuple, 格式為 (sets, reduces, method index, first, only), 其意義如下:

  • sets: int, 設定了多少點

  • reduces: int, 削減了多少點

  • mothod index: int, 返回後要跳到哪一個求解法

  • first: int, 返回後要讓其他求解法從哪一個數字開始解

  • only: bool, 返回後要讓其他求解法址只解第一個數字嗎

sudoku.sudoku.write_down_possible(m, **kw)[source]

如果常數 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, 返回後要讓其他求解法址只解第一個數字嗎