1. 程式人生 > >個人項目——最後篇

個人項目——最後篇

設計 數據 說明 個人項目 換來 結構 個數 實現 關系

一、實現過程:

  首先這個項目我把求解和生成分開寫了,生成函數我用回溯法+規則變換來生成終局。先用隨機數加回溯生成一個終局,再通過這個終局交換行、列、數字生成1372個終局。這樣共需要隨機回溯生成1000個左右終局即可。實現過程用了5個函數,分別是dfs回溯生成函數,一個初始化函數,一個隨機填數函數,一個變換函數,一個打印函數。dfs函數從1到81號格子填數,然後填的數由隨機填數函數決定。一直填滿最後判斷是否合格,再回溯。再根據這個終局先交換兩行,再交換兩列最後交換兩個數字的方式構造1372個終局。

技術分享圖片

求解函數我用了跳舞鏈的數據結構,共用了7個函數,分別是刪除列函數、恢復列函數、dfs,初始化函數、讀入函數,輸出函數,找對應關系函數,關系見流程圖。

對於單元測試,我是這樣設計的:

1.對於輸出到文件的函數,重新打開文件比對結果

2.對於不輸出到文件的函數,比對返回值或參數變化是否符合預期

3.對於調用其它函數的函數,因為它調用的函數已有專門的單元測試確保其正確,所以可以只檢查不是有調用過所產生的變化是否符合預期。

二、性能分析:

對於求解1000000組空白在30個左右的數獨用時30s左右,

技術分享圖片

可知時間主要是在刪除行和恢復行的過程。一開始性能瓶頸是輸入輸出速度太慢,經過使用字符讀入和字符輸出後優化了將近20s。

對於生成1000000個終局,用時6s左右,

技術分享圖片

時間主要是在變換的過程,原本的性能瓶頸在dfs過程以及輸出過於慢,通過使用變換規則和字符輸出優化。

三、代碼說明:

生成程序:

Dfs過程

技術分享圖片

變換過程

技術分享圖片

技術分享圖片

求解程序:技術分享圖片

讀入函數:

技術分享圖片

初始化函數:

技術分享圖片

Dfs求解過程:

技術分享圖片

技術分享圖片

四、時間表

技術分享圖片

個人項目——最後篇