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