數獨實(shí)驗報告范文
Sudoku 數獨實(shí)驗報告
一、 算法描述
求解Sudoku讓人最容易想到的方法是窮舉每個(gè)方格可能的值,如果符合條件,則得到解,不符合條件則進(jìn)行回溯。通過(guò)遞歸的方法,顯然可以得到數獨的解。
我想到的簡(jiǎn)單的遞歸方法,是每一行從左到右,試驗每一個(gè)方格可能的數字,進(jìn)行遞歸。這種方法看似非常麻煩,實(shí)際上對于一般的數獨題,速度是非常快的,思想比較簡(jiǎn)單,寫(xiě)出來(lái)的代碼也非常簡(jiǎn)單、易懂。
算法1:簡(jiǎn)單遞歸方法
從第一個(gè)格開(kāi)始,從1到9試驗,是否滿(mǎn)足行、列、九宮格互不相同的條件。若滿(mǎn)足條件,則填入該數字,再試驗下一個(gè)格。當一個(gè)格子出現沒(méi)有數字能填的情況時(shí),說(shuō)明已經(jīng)填的數字有誤,回溯,再進(jìn)行遞歸。
算法2:優(yōu)化的`遞歸算法
先遍歷所有格子,統計每種格子可能出現數字的個(gè)數。每次挑選可能出現數字個(gè)數最少的格子來(lái)進(jìn)行遞歸。
設置三維數組poss[i][j][k]來(lái)存儲可能出現數字的信息。poss[i][j][0]記錄i行j列的格子可能出現數字的個(gè)數,poss[i][j][k](1<=k<=9) 若poss[i][j][k]=1,表示k可能在(i,j)格出現。若poss[i][j][k]=0,表示k不可能在(i,j)格中出現。每次找poss[i][j][0]最小的格子,來(lái)進(jìn)行下一個(gè)遞歸。
算法3:生成數獨棋盤(pán)的算法
我最開(kāi)始的想法是窮舉法,隨機生成滿(mǎn)足行各不相同的9行,再判斷9宮格、每列是否符合要求,符合條件時(shí),隨機生成停止。然而,這種算法的當然時(shí)間復雜度顯然是過(guò)高。第99一步的隨機生成的次數是9*9/P9=9608。隨機生成一組棋盤(pán)耗時(shí)就非常大。后來(lái),我從求解的個(gè)數的程序獲得啟發(fā)。算法二對于1000多組解的數獨棋盤(pán),解起來(lái)也很快。隨機生成填9個(gè)方格,再用算法一的方法解出來(lái),取第一組正確的解作為棋盤(pán)即可生成填好的棋盤(pán)。再把一定數量的格子的數字隨機刪除,計算解的個(gè)數。如果解唯一,就得到了棋盤(pán)。
二、數據結構
這三種算法的數據結構不是非常復雜,只是普通的數組。
算法一:數組a[i][j]
算法二:數組a[i][j]和poss[i][j][k]
算法三:數組a[i][j]和poss[i][j][k]
三、時(shí)間效率分析
算法1:這種算法在tsinsen系統上只用了15ms得到全部答案。
雖然這種算法在tsinsen系統的測試中有很好的表現,但是我試了試在幾道骨灰級難度的題,發(fā)現這種算法可能會(huì )用到10秒以上的時(shí)間,并且測試數據不同,時(shí)間差異非常大。
我認為,這種算法的漏洞在于,如果開(kāi)始的格子可能出現的數字非常多,遞歸樹(shù)開(kāi)始的枝會(huì )非常多。并且,我們一般做數獨題,都會(huì )先挑可能出現數字個(gè)數最少的格子來(lái)填,充分利用了已知條件。然而,這種算法只按格子的行列順序來(lái)試驗,顯然非常傻。于是,我想出了第二種算法。
算法2:這種算法耗時(shí)長(cháng)。
非常令人失望的是,雖然它能在短時(shí)間內解出骨灰級題目,但是,和上一個(gè)算法相比,對于簡(jiǎn)單的題目,它比較耗時(shí)。在tsinsen系統中測試的時(shí)間是91ms。它的缺陷在于,每次遞歸都必須更新(i,j)格子所在的行、列、九宮格所有的元素。每次要求20個(gè)數的poss[i][j][]。回溯同樣要更新。并且求poss[i][j][]的函數時(shí)間復雜度是O(n)。每一步所耗時(shí)間比上一種算法多很多。但是,總的試驗的步數能顯著(zhù)減少。 所以,這種算法適用于數獨解題的動(dòng)畫(huà)演示和解極難題目。
四、程序結構
五、運行結果
六、總結和反思
后來(lái)老師提高了難度,要求程序能求出多解數獨題的解的個(gè)數。幾千個(gè)解的數據都能迅速得出答案,但是幾萬(wàn)個(gè)解的數據,需要很長(cháng)時(shí)間,更別提幾百萬(wàn)的數據。這兩種遞歸的算法都有問(wèn)題,優(yōu)化的空間也有限,需要更強大、高效的算法。
這次Project讓我不斷思考,改進(jìn)了最初的算法。編程是確實(shí)是一個(gè)克服困難、不斷改進(jìn)與超越的過(guò)程。總有新的數據擺在面前,把原來(lái)的算法打擊得很慘,激勵著(zhù)我們研究更加先進(jìn)的算法。
數獨pk
煩心事
大家有許多煩心事對吧?而我的最大的煩惱——天天睡不好覺(jué)。
我五年級了,天天補課,每天回家都9點(diǎn)多了,洗洗弄弄也都快10點(diǎn)了,而那時(shí)的我已疲憊不堪了,幾忽是倒床就睡,夜里也好幾次上廁所,搞得我天天失眠,我也化起了我班流行的熊貓裝。而且,這個(gè)季節是春季,最流行的'是春困,每天下午不是哈欠連天的?
這不,星期四我從宋老師那里回來(lái),洗過(guò)澡。歪歪倒倒地爬上床,蓋好被子,不到三分鐘就呼呼大睡,鼾聲驚天動(dòng)地。第二天,我還沒(méi)醒,老媽就大聲喊道:“起床了,上學(xué)了。”這聲音還驚不醒我,老媽提高了分貝。我才瞇瞇乎乎地睜開(kāi)眼睛。看見(jiàn)老媽正在旁邊,我知道睡不了了。便乖乖地起來(lái)。刷牙洗臉,一切干好之后,便被踢出了家門(mén)。
終于熬到了下午,每節課都是痛苦難以訴說(shuō),全班同學(xué)都冷場(chǎng),沒(méi)有一個(gè)舉手發(fā)言的。老師也是經(jīng)神缺佳。哈欠一個(gè)接著(zhù)一個(gè),連話(huà)都說(shuō)不圓了。最后老師無(wú)可奈和地說(shuō):“放你們兩節課睡覺(jué)。”說(shuō)完便倒頭就睡。
下次覺(jué)一定要睡好,不然的話(huà)功課也會(huì )下降的。
學(xué)習?shū)B(niǎo)網(wǎng)站是免費的綜合學(xué)習網(wǎng)站,提供各行各業(yè)學(xué)習資料、學(xué)習資訊供大家學(xué)習參考,如學(xué)習資料/生活百科/各行業(yè)論文/中小學(xué)作文/實(shí)用范文實(shí)用文檔等等!
寫(xiě)作基礎 | 作文指導 |
寫(xiě)作經(jīng)驗 | 寫(xiě)作方法 |
文學(xué)常識 |
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據《信息網(wǎng)絡(luò )傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個(gè)月內通知我們,我們會(huì )及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習?shū)B(niǎo). 頁(yè)面生成時(shí)間:0.188秒