其實一直都很想寫個數獨的遊戲,最近剛好看了《程式設計之美》,得到了一些啟發。
好,這時第一節,構造數獨矩陣。主要用到深度搜尋演算法,先往下乙個格仔填數字(依次填入1~9),在9*9**的行中檢驗數字有沒有出現過,在9*9**的列中檢驗數字有沒有出現過,最後在3*3的**中檢驗數字是否出現過。如果最後1~9中所有的數字都不符合,則開始回溯。重複以上過程,最終我們可以得到乙個數獨矩陣。
核心**:
//ok我們現在可以得到乙個數獨矩陣了:得到乙個數獨矩陣
public
bool
generatevalidmatrix()
if (currentcell.validlist.count>0
)
else
}"x: " + currentcell.x.tostring() +
//" y: " + currentcell.y.tostring() +
//" number: " + currentcell.number.tostring());
}
return
true
; }
private listgetvalidvaluelist(coord coord)
}return
nextnumberlist;
}
但是,這只是乙個可行解,只是乙個,這樣的話用來做遊戲就沒有什麼趣味性了,我們應該得到一些隨機的可行解。
下面提供三種思路
1、行列交換
交換黃色那部分,我們得到另外乙個可行解,同理,還可以交換列(如果沒算錯的話,應該可以得到6*6=36種可行解,應該也夠玩一陣子了)
2、旋轉
可以在上面行列交換的基礎上再旋轉(每次將矩陣旋轉90°也可以)
3、在currentcell.picknextvalidvalue();這個函式做手腳
cell裡面儲存了下次可用的數字列表,只要隨機的取列表中的這些數字就可以得到乙個隨機的矩陣了
最後再隨機地把**中的數字變為0,我們就得到乙個可以玩的數獨矩陣了
行,下次再做乙個介面,然後再寫解數獨的那部分,欲知後事如何,請聽下回分解……
構造數獨和解數獨
數獨,俗稱九宮格,由乙個9 9的網格組成,整個網格又分成9個3 3的小正方形網格,每個格仔有乙個數字 1 9 數獨滿足如下要求 1 每個數字在每一行只出現一次 2 每個數字在每一列只出現一次 3 每個數字在每個3 3的小區域中也只出現一次 如下圖所示,為我們比較常見的數獨形式,為乙個缺了數字的數獨,...
1 15 構造數獨
一 用回溯法構造數獨 include include include include include using namespace std int sudu 9 9 void sudu print int sudu 9 cout endl bool is digital sudu int sudu...
1 15 構造數獨
一 用回溯法構造數獨 include include include include include using namespace std int sudu 9 9 void sudu print int sudu 9 cout endl bool is digital sudu int sudu...