C 數獨遊戲(一) 構造數獨矩陣

2022-05-06 14:45:10 字數 1402 閱讀 4141

其實一直都很想寫個數獨的遊戲,最近剛好看了《程式設計之美》,得到了一些啟發。

好,這時第一節,構造數獨矩陣。主要用到深度搜尋演算法,先往下乙個格仔填數字(依次填入1~9),在9*9**的行中檢驗數字有沒有出現過,在9*9**的列中檢驗數字有沒有出現過,最後在3*3的**中檢驗數字是否出現過。如果最後1~9中所有的數字都不符合,則開始回溯。重複以上過程,最終我們可以得到乙個數獨矩陣。

核心**:

//

得到乙個數獨矩陣

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;

}

ok我們現在可以得到乙個數獨矩陣了:

但是,這只是乙個可行解,只是乙個,這樣的話用來做遊戲就沒有什麼趣味性了,我們應該得到一些隨機的可行解。

下面提供三種思路

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...