3 回答

TA貢獻1876條經驗 獲得超7個贊
簡單:
使用高效的回溯算法查找所有解決方案。
如果只有一種解決方案,那么您已經完成。否則,如果您有多個解決方案,請找到大多數解決方案都不相同的位置。在此位置添加號碼。
轉到1。
我懷疑您會找到比這更快的解決方案。

TA貢獻1900條經驗 獲得超5個贊
這是我自己的SuDoKu程序執行此操作的方式:
從完整的有效木板開始(填寫81個數字)。
列出所有81個單元格的位置,并隨機洗牌。
只要列表不為空,請從列表中移至下一個位置,然后從相關單元格中刪除該數字。
使用快速回溯求解器測試唯一性。從理論上講,我的求解器能夠計算所有解決方案,但是為了測試唯一性,當發現多個解決方案時,它將立即停止。
如果當前電路板仍然只有一種解決方案,請轉到步驟3)并重復。
如果當前電路板有多個解決方案,請撤消上一次移除的操作(步驟3),然后從列表中的下一個位置繼續執行步驟3。
測試完所有81個位置后停止。
這不僅為您提供了唯一的電路板,而且還為您提供了在不破壞解決方案唯一性的情況下無法刪除任何其他編號的電路板。
當然,這只是算法的后半部分。上半部分是首先找到一個完整的有效木板(隨機填充?。?,其工作原理非常相似,但“方向相反”:
從一個空板開始。
在其中一個空閑單元格上添加一個隨機數(隨機選擇該單元格,并根據SuDoKu規則從對該單元格有效的數字列表中隨機選擇該數字)。
使用回溯求解器檢查當前電路板是否至少具有一種有效的解決方案。如果不是,請撤消步驟2,然后重復另一個數字和單元格。請注意,此步驟可能會自己產生完整的有效板,但絕不是隨機的。
重復該操作,直到木板完全充滿數字為止。

TA貢獻1883條經驗 獲得超3個贊
你可以作弊。從可以解決的現有Sudoku面板開始,然后擺弄它。
您可以將三個3x3塊的任何行與任何其他行交換。您可以將三個3x3塊的任何列與另一列交換。在每個塊行或塊列中,您可以交換單行和單列。最后,您可以對數字進行置換,以便在填充位置上存在不同的數字,只要置換在整個板上都保持一致即可。
這些更改都不會使可解決的電路板無法解決。
添加回答
舉報