自製sudoku謎題與保存方式

很多人自行製作數獨謎題(標準數獨,以下同),不管設計程式自動產出或是手動設計謎題,最終都會發生謎題保存的問題;如何有效率的將產出謎題分門別類,確是煞費苦心。

這裡提供作者製作謎題的方法之一與保存的方法供參考,希望有心得的愛好者也能提供相關方法供參考與學習。

當然,保存方式仍需以製謎產出方式為主,不同模式產出,當然會有不同的做法。

簡要說明作者產出謎題的方法之一:


空白數獨紙


數獨初盤(謎題)


數獨樣式


一、選定提示數目

選定想要設計的謎題提供多少個提示數字。

二、選定數獨樣式

(一)選定數獨樣式圖騰(圖例為18個提示格樣式)。

(二)必須依經驗設計及篩選樣式,很多樣式似乎無法產出合格謎題。

樣式產生器-提示數分類,樣式圖騰分類,樣式碼編碼分類,樣式產出難易分類。



三、填入數字

在樣式格內填入數字,可以依序填入,也可以隨意填入。

填入數字的排序方法會影響產出結果,必須紀錄、測試獲得經驗值。

填完後就成為一個謎題, 可以用電腦一次產生50萬題或更多作解答測試檔。

填數產謎器
填數區塊分類,填數方式分類,填數流程分類。


填入數字的排序方法之一。


填入數字的排序方法之二。


本樣式因對稱關係,必須要保留對稱格,填入數字的排序方法有所差異。

四、測試解答(解答判斷)

以分段式累加法測試判斷(樣式對稱與數字關聯性關係)。

分類無解與多重解謎題。無解謎題則檢討、更換填數方式與關係,再作修正、測試;當測試謎題到達一定數量或填數方法種類到達一定量,則分類該樣式屬性,如:無法產出或不易產出等。

分類多重解謎題,選擇10重解以下謎題,繼續回到填入數字作修正產出測試檔。

篩選出2重解謎題,繼續回到填入數字作修正產出測試檔。
(因為對稱關係,2重解謎題的再變動亦無法產出唯一解謎題時,保留3重解樣式來作填測)

直到出現唯一解謎題。

多重解選擇器-設定選擇多重解數目,如:欲保留8重解的謎題,則超過8重解,停止該題計算,換下一題。

雙重解篩選器-使用多種驗算方式尋找雙重解謎題,雙重解謎題再產出唯一解謎題。

唯一解篩選器-多種驗算方式檢測唯一解,核驗後成為合格謎題。

難易度篩選器-解題方法種類測試(含順次)分類,錯誤處理分類(無法解題時,配合國外大師級程式作測試),難易度分級分類。


上述產出謎題的方式,看似繁複,實際上相當有效率,筆者初期謎題產出多以此方式創造,適合尋找提示數少的樣式謎題,尤其希望能有相當漂亮的樣式圖騰時;當然,必須經過相當的錯誤測試,慢慢檢討、變換、修正後獲得,尤其在列宮與列宮,小宮與小宮,小方格與小方格的對稱、位置、相互影響等關係,必須有相當的了解,才能尋找到期望的謎題。

謎題的分類與保存

產出了這麼多不同樣式的測試謎題、合格謎題,要如何分類、歸檔,卻是一大問題,因此思考出以樣式碼與解答盤結合保存的方式。

樣式碼:

標準數獨盤為81個小方格組成,(55)中心點小方格為無對稱性的單獨格,其餘小方格都可以找到對稱性,所以將(55)小方格排除計算。


可以分成前40個(1-40)小方格與後40個(42-81)小方格。
(1)小方格的對稱格為(81)小方格。


套入樣式格。


將40個小方格分成10組,每組包含4個小方格,依序編成1~10組群格。


套入樣式格。


每組群格以一個十六進位字元碼代表,共有10個字元,樣式碼為10個字元組成。

每組群格以二進位碼表示,空白小方格以0表示,樣式格以1表示。

如上圖:第一組群格為編號1~4小方格,其中編號2與編號4填有樣式,所以二進位碼表示為:0101

將二進位碼 0101 轉換成 十六進位字元碼 為:5 (0x05)

0 => 0000
1 => 0001
2 => 0010
3 => 0011
4 => 0100
5 => 0101
6 => 0110
7 => 0111
8 => 1000
9 => 1001
A => 1010
B => 1011
C => 1100
D => 1101
E => 1110
F => 1111

因此上圖的樣式代碼為:5028140442 ,編碼方式如下:

樣式盤列:數字0代表空白小方格,數字1代表樣示格。
010100000
010100000
010100000
001000100
001000100
001000100
000001010
000001010
000001010

樣式條列:
0101 0000 0010 1000 0001 0100 0000 0100 0100 0010 0 0100 0010 0010 0000 0010 1000 0001 0100 0000 1010


編號1~40:分成10個群格,每組群格以一個十六進位字元碼表示
0101(5) 0000(0) 0010(2) 1000(8) 0001(1) 0100(4) 0000(0) 0100(4) 0100(4) 0010(2)

編號41:第(55)小方格,數字0代表雙數提示格謎題,數字1代表單數提示格謎題。(筆者把(55)小方格訂為「不可侵犯的天井」,所以設計謎題時,沒有設計單數提示格謎題)
0

編號42~81:對稱列,不編碼。
0100 0010 0010 0000 0010 1000 0001 0100 0000 1010


解答盤:

751482936
396571824
842693571
517824369
428936715
963715248
639157482
175248693
284369157

解答條列:
751482936396571824842693571517824369428936715963715248639157482175248693284369157

結合樣式碼:
5028140442_751482936396571824842693571517824369428936715963715248639157482175248693284369157

結合後就可以同時擁有樣式、數獨初盤(謎題)、數獨終盤(解答),也易於排序、搜尋與分類、存檔。

即使沒有電腦,也可以輕易的在數獨紙上手列數獨謎題供娛樂使用。

當然,也可以加編難易度總分數,最高技法,技法次數,娛樂值等數據。

熱門文章