數(shù)獨(dú)題目如何自己出?
因?yàn)橛信笥严雽W(xué)習(xí)如何自己出一道數(shù)獨(dú)題目,今天我們就來介紹一下這個(gè)。
Part 1 手動(dòng)出題
手動(dòng)出題分兩種:空盤填數(shù)和終盤摳數(shù)。它們是兩種完全相反的出題操作。一種是從空盤開始,上手試填一些位置,然后邊試邊解,直到題目唯一解的過程;另外一種則是找一個(gè)終盤,然后去掉一些數(shù)字,邊摳邊解題,使得題目唯一解的過程。
1-1 空盤填數(shù)
我們?cè)囍鴣砜纯慈绾慰毡P填數(shù)出一道唯一解的題目。首先,我們要找一個(gè)數(shù)字?jǐn)[放的基本模型。比如下面這樣:

接著,我們需要在藍(lán)色格子里填上合適的數(shù)字來保證題目的唯一性。這個(gè)形狀是你任意指定的,但有一些基本原則需要你注意。
不能空上三個(gè)連續(xù)的宮不放藍(lán)色格子;
不能空出多于 5 個(gè)宮不放藍(lán)色格子;
不能在并排的三個(gè)宮里,空上兩行(或兩列)不放藍(lán)色格子;
建議藍(lán)色格子至少 18 個(gè)(但請(qǐng)盡量保證藍(lán)色格子至少 24 個(gè));
建議藍(lán)色格子擺放不要太密集(否則題目可能會(huì)過于簡(jiǎn)單);
中間紅色格子的邊框請(qǐng)你忽略掉。整個(gè)出題的過程都跟這個(gè)紅色邊框沒有任何的關(guān)系。
另外,任何一個(gè)唯一解的數(shù)獨(dú)題目,最少也有 17 個(gè)提示數(shù),但是,17 提示數(shù)的題目我們目前沒有任何辦法可以自己出題搞出來,而基本都是電腦通過排列組合的形式生成的,因此我們無法手動(dòng)完成“只用 17 個(gè)藍(lán)色格子就可以出一個(gè)唯一解的題目”這一個(gè)問題。數(shù)獨(dú)出題也是 NP-Hard 問題。換句話說,我們沒有能力通過人工進(jìn)行證明和得到出題的通用效率高的過程:因?yàn)闀r(shí)間耗費(fèi)不是我們?nèi)祟惸軌虺袚?dān)得起的。
我相信你應(yīng)該看得懂上面給的這些條條款款,所以我就不作說明了。說白了就是不要讓空白(沒有標(biāo)記藍(lán)色的格子)集中到一起,否則就不能保證唯一性。另外,上面選擇的這個(gè)形狀比較合適,是因?yàn)檫@樣的形狀,藍(lán)色格子比較分散,盡量都保證了每個(gè)行、列、宮都有藍(lán)色格子放提示數(shù),這樣就限制得很嚴(yán)格了。
接著,我們?cè)囍S意在藍(lán)色格子里填上我們喜歡的數(shù)字。但請(qǐng)注意,填數(shù)的時(shí)候,一邊填一邊看數(shù)字是否對(duì)周圍會(huì)產(chǎn)生影響。比如說,我連續(xù)填入了多個(gè) 1,但是這些填入的 1 會(huì)立刻影響到某個(gè)行、列、宮,導(dǎo)致這個(gè)(或者這些)行、列、宮里無法找到合適的位置填入 1。這個(gè)時(shí)候我們就需要修改數(shù)字了。一定要保證數(shù)字填入的時(shí)候是合理的。

我們?cè)囍S意填入了 9 個(gè)不重樣的數(shù)字。顯然,這么做是可以的,因?yàn)椴恢貥拥臄?shù)字就不會(huì)影響到別的數(shù)字的填數(shù)位置。
接著,其它藍(lán)色格子我們還沒有填數(shù),我們還得繼續(xù)填。繼續(xù)找合適的數(shù)字去填;當(dāng)然,也不要過于在意填數(shù)必須是連續(xù)的序列啊、有意義的序列這類要求較高的條件。因?yàn)檫@樣做很有可能會(huì)導(dǎo)致題目無法進(jìn)行,或者無法保證唯一性。

比如這樣,連續(xù)的 1、2、3、4 很有可能就無法保證題目唯一性了。因此,我們隨便填一些數(shù)字進(jìn)去就可以。填入了這么多數(shù)字后,我們需要手動(dòng)完成解題操作。因?yàn)樗{(lán)色格子還沒有全部擺放數(shù)字,因此我們現(xiàn)在要通過尚未完成的殘局開始做題。能做多少是多少,這里是為了看是不是有藍(lán)色的數(shù)字是可以通過解題固定下來的。換句話說,我們已經(jīng)有的這些數(shù)字很有可能會(huì)讓一些沒填數(shù)的藍(lán)色格子固定下唯一的填法。在這個(gè)基礎(chǔ)上,如果想要為這個(gè)位置的藍(lán)色格子填上別的數(shù)字的話,顯然就無解了。
但是,如果數(shù)字還不夠出現(xiàn)這類現(xiàn)象(也不會(huì)造成別的格子無解)的話,我們就繼續(xù)往藍(lán)色格子里填數(shù),直到一些位置可解了位置。

現(xiàn)在我們假設(shè)左下方填入 7、1、7、1。這些數(shù)字是隨意給的,你可以給別的數(shù)字??梢钥吹剑@樣填的話,7 宮的 1 就明顯可以直接通過排除法固定下來了。因此,我們就按照這個(gè)形式去找填數(shù)結(jié)果。
如果你并不是為了出難題,那么排除和唯一余數(shù)在出題過程中就基本夠用了。如果你發(fā)現(xiàn)目前排除和唯一余數(shù)無法進(jìn)行解題操作,那么就說明題目數(shù)字還不夠。這個(gè)時(shí)候你還得加數(shù)字。
最終,我們找到了一個(gè)合適的組合:

如圖所示,這個(gè)題目是唯一解的。把藍(lán)色數(shù)字抽取出來,就是題目了。
1-2 終盤摳數(shù)
說實(shí)話,終盤摳數(shù)比前文做起來要簡(jiǎn)單。但是,由于終盤固定,因此我們無法自定義一些復(fù)雜的條件在里面,比如“一些位置是連續(xù)擺放的提示數(shù),數(shù)字也是連續(xù)的”這些條件,只能看終盤本身的造化了。如果終盤不存在這樣的形式的話,那么我們無法通過終盤摳數(shù)字的模式去出這樣的題目。
我們隨便找一個(gè)題目的終盤來作為基礎(chǔ)盤面生成:

下面我們從盤面里摳一些數(shù)字來完成出題。你要摳成什么形狀都隨你定,但是還是前面的那些條條款款,不要摳到題目沒辦法唯一解了。
注意,摳掉的位置都是空格,沒摳掉的位置全是提示數(shù)。因此你得多摳點(diǎn)數(shù)字下來。不然題目會(huì)過于簡(jiǎn)單。

繼續(xù)摳。

還不夠少。繼續(xù)。

繼續(xù)。

實(shí)在無法繼續(xù)進(jìn)行了。題目就這樣了。一共 28 個(gè)提示數(shù),不管數(shù)字多少,總之題目不難就是了。
Part 2 自動(dòng)出題
下面說一下使用電腦軟件進(jìn)行自動(dòng)出題。因?yàn)槭謾C(jī) App 我了解得不多,因此我就不在這里班門弄斧了。說一下電腦的軟件。
HoDoKu,是荷蘭的程序員開發(fā)的一個(gè)程序,可以提供題目分析、出題等功能。我們用的是出題功能。

點(diǎn)這個(gè)就完事了。然后就會(huì)列出題目,題目用到的技巧等等信息。

呃……這個(gè)又過于簡(jiǎn)單了。但是電腦出題并不能設(shè)置各種條件。HoDoKu只能生成中心對(duì)稱擺放的提示數(shù)的題目,且是隨機(jī)出的,因此題目本身你無法控制數(shù)字的擺放條件。