個人項目——最後篇
一、實現過程:
首先這個項目我把求解和生成分開寫了,生成函數我用回溯法+規則變換來生成終局。先用隨機數加回溯生成一個終局,再通過這個終局交換行、列、數字生成1372個終局。這樣共需要隨機回溯生成1000個左右終局即可。實現過程用了5個函數,分別是dfs回溯生成函數,一個初始化函數,一個隨機填數函數,一個變換函數,一個打印函數。dfs函數從1到81號格子填數,然後填的數由隨機填數函數決定。一直填滿最後判斷是否合格,再回溯。再根據這個終局先交換兩行,再交換兩列最後交換兩個數字的方式構造1372個終局。
求解函數我用了跳舞鏈的數據結構,共用了7個函數,分別是刪除列函數、恢復列函數、dfs,初始化函數、讀入函數,輸出函數,找對應關系函數,關系見流程圖。
對於單元測試,我是這樣設計的:
1.對於輸出到文件的函數,重新打開文件比對結果
2.對於不輸出到文件的函數,比對返回值或參數變化是否符合預期
3.對於調用其它函數的函數,因為它調用的函數已有專門的單元測試確保其正確,所以可以只檢查不是有調用過所產生的變化是否符合預期。
二、性能分析:
對於求解1000000組空白在30個左右的數獨用時30s左右,
可知時間主要是在刪除行和恢復行的過程。一開始性能瓶頸是輸入輸出速度太慢,經過使用字符讀入和字符輸出後優化了將近20s。
對於生成1000000個終局,用時6s左右,
時間主要是在變換的過程,原本的性能瓶頸在dfs過程以及輸出過於慢,通過使用變換規則和字符輸出優化。
三、代碼說明:
生成程序:
Dfs過程
變換過程
求解程序:
讀入函數:
初始化函數:
Dfs求解過程:
四、時間表
個人項目——最後篇