|
數(shù)獨是一種老少皆宜的數(shù)學(xué)游戲,大家用零散的時間就可以玩上幾局?jǐn)?shù)獨,有助于人們緩解壓力,培養(yǎng)觀察力和耐力,鍛煉大腦。 數(shù)獨游戲的規(guī)則也很簡單,只需一支鉛筆就能游戲,如: ![]() 在9*9的格子中,已經(jīng)填入了一些數(shù),你所要做的就是把其余的格子中全部填入1~9的數(shù),使得每一橫行,每一豎行,以及粗線所包圍的9個九宮格中,1~9這些數(shù)字全部只出現(xiàn)一次。 其實,如果用集算器的話,任何一局?jǐn)?shù)獨謎題都能隨手解決。 首先,把數(shù)獨問題記錄入一個文本文件sudoku01.txt:
為了排列整齊,其中空白的格子用0代替。解決問題的代碼如下: ![]() 下面,詳細(xì)分析一下這段代碼。 B1中將文本文件逐行讀入,構(gòu)成一個序列: ![]() C1中將每一行中各個格子的值拆開,使得每一行都構(gòu)成一個序列:
D1中將各個格子的值順次連接為一個序列,以便于計算: ![]() 再來看A3中的子程序,執(zhí)行時,將已填入部分?jǐn)?shù)據(jù)的數(shù)獨格值序列作為參數(shù)復(fù)制在A3中,將當(dāng)前正在填寫的格子序號復(fù)制在B3中。C3和D3根據(jù)格子序號計算出格子所在的行和列。 在第4至6行中,判斷當(dāng)前的格子中是否已經(jīng)被填入了數(shù),如果已經(jīng)執(zhí)行到了最后一個格子(第81個),說明謎題已經(jīng)解開,將答案記錄在A2的序列中;如果未執(zhí)行到最后,則遞歸調(diào)用A3中的子程序,繼續(xù)填寫下一個格子。 在第7~13行,則是當(dāng)前格子中為0時的處理,此時需要嘗試填入數(shù)值。在A7中列出同一行的數(shù)構(gòu)成的序列,B7中列出同一列的數(shù)構(gòu)成的序列,D8中列出所在九宮格的數(shù)構(gòu)成的序列。由于當(dāng)前格子不能和同一行、同一列或者同一九宮格中已有的數(shù)相同,所以在B9中通過序列運算集合求差,計算出當(dāng)前格子可能填入的所有數(shù)。 在10~12行,在當(dāng)前格中嘗試填入每一個允許的數(shù),如果填到了最后一個格子,說明問題解決,把答案記錄在A2中;否則遞歸調(diào)用A3中的子程序,繼續(xù)填寫下一個格子。 如果B9中的所有結(jié)果都已經(jīng)嘗試過,則在第13行中把當(dāng)前格中的數(shù)恢復(fù)為0,繼續(xù)修改前面格子中的數(shù)。 在主程序的B2中,調(diào)用A3中的子程序,從第一個格子開始,嘗試填數(shù)。執(zhí)行后,即可在A2中看到執(zhí)行結(jié)果:
對于普通的數(shù)獨問題,A2中只會有1個解,如果數(shù)獨題目存在問題,也可能出現(xiàn)無解或者多個解的情況。為了便于查看,在D2中,將得到的第1個解填入序表,得到的解答如下:
|
|
|