數獨演算法代碼
我編的能算所有的九宮數獨了,最難的也就0.1秒以內搞定,沒用什麼遺傳演算法~
② 數獨問題'高級數獨沒有更快捷的解答方式嗎
計算機演算法簡介
本文所討論的演算法是一種通用演算法,雖然不能說是最快的演算法,但卻可以求解所有的數獨游戲。
演算法准備:
1、一個可能性:表示某個格子可能填寫的數字。
2、可能性數目:表示某個格子可能性的數量。為0表示已經確定。
3、區域標志:表示某個格子所在區域(小九宮)的ID,所有區域標志都是預定義的。
4、確定數量:表示所有數字已經確定的格子的數量,為81時則表示已經找到解。
5、整個九宮格用三個矩陣表示:可能性矩陣,數目矩陣,區域標志矩陣
演算法的基本思想:
步驟1、將所有未確定的格子的可能性定義為0xFFFF(即所有數字都可能),可能數目為9。
步驟2、尋找所有確定的格子A(可能數目為0),在所有與A同行、同列和同區域的未確定的格子的可能性中減去與A相同的可能性。例如:A確定為9,則與A同行、同列和同區域(區域標志相同)的未確定的格子的可能性與0xFEFF按位與(除去可能性9),並將其可能性數目減少。
在除去可能性的過程中如果發現某個格子B的可能性數目由1減小為0,說明B和A只能取相同的數字,這可能是題目本身無解引起,也肯能是由於步驟3中搜索方向不對引起的,可認為此方向的搜索無解,退出這一方向的搜索。定義這個檢查為唯一性檢查。
步驟3、尋找所有未確定格子中可能性數目最少的格子M,如果M的可能性數目為1,則確定M:將M的可能性數目定義為0,並把確定數量加1,如果此時確定數量達到81,則報告找到解,否則,在所有與M同行、同列和同區域的未確定的格子的可能性中減去與M相同的可能性,並進行唯一性檢查。然後重復步驟3。
如果M的可能性大於1,則把M假設為所有M的可能性,分多個方向進行搜索,在每一個搜索方向重復步驟3(這個可以用遞歸來實現)。
演算法性能
本演算法可以在50毫秒以內求解任意有解的數獨游戲。
③ 請問如何隨機生成一個數獨
答:關於這個問題,
數獨(すうどく,Sūdoku)是一種運用紙、筆進行演算的邏輯游戲。玩家需要根據9×9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行、每一列、每一個粗線宮內的數字均含1-9,不重復。
如上圖所示,我需要一個簡單的原型,也就是按照一定規則組成的數獨表,通過一個隨機生成的Map(也就圖中所示的參照表),類似與翻譯似的經過兩次轉換,變成一個看似沒有規則但都繼承了原型表規律的新的數獨表。另外,值得一提的是,這兩衡襪次參照生成並不需要使用同一個Map。
缺陷:這個演算法其實只能算是「偽演算法」,因為他並沒有真正的生成一個隨機的數獨表,只是一種表象上