2017BUAA個人項目小結
一、作業鏈接
http://www.cnblogs.com/jiel/p/7545780.html
二、評分細則
0.注意事項
- 按時間完成並提交——正常評分
- 晚交一周以內——0分
- 晚交一周以上或不交——倒扣本次作業分數
- 抄襲——倒扣本次作業分數
1.博客細則
博客共15分,分布如下:
- 在文章開頭給出Github項目地址。(1')
- 在開始實現程序之前,在下述PSP表格記錄下你估計將在程序的各個模塊的開發上耗費的時間。(0.5')
- 解題思路描述。即剛開始拿到題目后,如何思考,如何找資料的過程。(3')
- 設計實現過程。設計包括代碼如何組織,比如會有幾個類,幾個函數,他們之間關系如何,關鍵函數是否需要畫出流程圖?單元測試是怎么設計的?(4')
- 記錄在改進程序性能上所花費的時間,描述你改進的思路,並展示一張性能分析圖(由VS 2017的性能分析工具自動生成),並展示你程序中消耗最大的函數。(3')
- 代碼說明。展示出項目關鍵代碼,並解釋思路與注釋說明。(3')
- 在你實現完程序之后,在下述PSP表格記錄下你在程序的各個模塊上實際花費的時間。(0.5')
2.程序細則
程序共35分,分布如下:
-
源代碼管理評分,該評分主要通過源代碼管理中的commit注釋信息,增量修改的內容,是否有運行說明等給分。(2')
-
正確性評分,正確性測試中輸入范圍限制在 1-1000,要求程序在 60 s 內給出結果,超時則認定運行結果無效。(20')
-
錯誤處理,對-c參數進行一系列錯誤參數進行測試,根據程序是否能正常運行給分。(3')
-
性能評分,性能測試中輸入范圍限制在 10000-1000000,沒有時間的最小要求限制。(10')
- 當程序的正確性評分等於20分時才可以參與性能評分環節,所以請各位同學務必保證自己程序的正確性。
- 性能評分將采取檔級評分制度,助教將根據同學們的程序跑同一數據耗費的時間長度將程序分為若干檔,每一檔的同學得到的分數為 10/檔級數。
-
附加題。(5')
三、博客分數列表
注:點擊表頭元素可進行排序
| INDEX | 作業地址 | Github | PSP前 | 思路 | 設計 | 優化 | 關鍵代碼 | PSP后 | 總分 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 15061183 | 1 | 0.5 | 3 | 4 | 3 | 3 | 0.5 | 15 |
| 2 | 15061144 | 1 | 0.5 | 3 | 4 | 2.5 | 2.5 | 0.5 | 14 |
| 3 | 15061104 | 1 | 0.5 | 3 | 3 | 1 | 2.5 | 0.5 | 11.5 |
| 4 | 15061132 | 1 | 0.5 | 3 | 2.5 | 3 | 2.5 | 0.5 | 13 |
| 5 | 15231196 | 1 | 0.5 | 2 | 3 | 3 | 3 | 0.5 | 13 |
| 6 | 15061111 | 1 | 0.5 | 2.5 | 3 | 2 | 2.5 | 0.5 | 12 |
| 7 | 15231058 | 1 | 0.5 | 3 | 3 | 2 | 2.5 | 0.5 | 12.5 |
| 8 | 15271106 | 1 | 0.5 | 3 | 3 | 3 | 2.5 | 0.5 | 13.5 |
| 9 | 15061199 | 1 | 0.5 | 3 | 4 | 3 | 3 | 0.5 | 15 |
| 10 | 15061188 | 1 | 0.5 | 2.5 | 3 | 3 | 2.5 | 0.5 | 13 |
| 11 | 15061074 | 1 | 0.5 | 2.5 | 3 | 3 | 2.5 | 0.5 | 13 |
| 12 | 15061119 | 1 | 0.5 | 2.5 | 3 | 2 | 2.5 | 0.5 | 12 |
| 13 | 15061080 | 1 | 0.5 | 2.5 | 2.5 | 2 | 3 | 0.5 | 12 |
| 14 | 15061180 | 1 | 0.5 | 2.5 | 3.5 | 2.5 | 2.5 | 0.5 | 13 |
| 15 | 15061075 | 1 | 0.5 | 3 | 2.5 | 2.5 | 2 | 0.5 | 12 |
| 16 | 15061187 | 1 | 0.5 | 2.5 | 3 | 3 | 3 | 0.5 | 13.5 |
| 17 | 15061101 | 1 | 0.5 | 2 | 2.5 | 1 | 2.5 | 0.5 | 10 |
| 18 | 15061129 | 1 | 0.5 | 3 | 3.5 | 3 | 3 | 0.5 | 14.5 |
| 19 | 15061186 | 1 | 0.5 | 2 | 3 | 2.5 | 2.5 | 0.5 | 12 |
| 20 | 15061189 | 1 | 0.5 | 2.5 | 4 | 2.5 | 3 | 0.5 | 14 |
| 21 | 15231177 | 1 | 0.5 | 3 | 2.5 | 2.5 | 2.5 | 0.5 | 12.5 |
| 22 | 15061067 | 1 | 0.5 | 2.5 | 2.5 | 3 | 0 | 0.5 | 10 |
| 23 | 15061151 | 1 | 0.5 | 2 | 3 | 2.5 | 3 | 0.5 | 12.5 |
| 24 | 14011100 | 1 | 0.5 | 3 | 3 | 3 | 3 | 0.5 | 14 |
| 25 | 15061175 | 1 | 0.5 | 2 | 3 | 2 | 3 | 0.5 | 12 |
| 26 | 14061213 | 1 | 0.5 | 2.5 | 2.5 | 1 | 3 | 0.5 | 11 |
| 27 | 15061069 | 1 | 0.5 | 2.5 | 3 | 2 | 3 | 0.5 | 12.5 |
| 28 | 15061085 | 1 | 0.5 | 1 | 0 | 0 | 0 | 0.5 | 3 |
| 29 | 15061122 | 1 | 0.5 | 3 | 3.5 | 3 | 3 | 0.5 | 14.5 |
| 30 | 15061077 | 1 | 0.5 | 2.5 | 2.5 | 0 | 2 | 0.5 | 9 |
四、自動測試得分列表
測試結果詳見:http://www.cnblogs.com/ChildishChange/p/7609751.html
得分說明:
- 如果進行一次額外的修改,修改系數減0.1
- 每一項測試的前五項為正確性測試,每項2分滿分
- 每一項測試的后兩項為性能測試,每項2.5分滿分
- “-c 50000”測試中,以1s划檔
- “-c 1000000”測試中,以10s划檔
- “-s 50000puzzle.txt”測試中,以10s划檔
- “-是1000000puzzle.txt”測試中,以60s划第一檔,300s划第二檔
最終得分為:(“-c”正確性得分+“-c”性能得分)ד-c”修改系數+(“-s”正確性得分+“-s”性能得分)ד-s”修改系數
| INDEX | 作業地址 | 正確性得分 | 性能分1(1s分檔 | 性能分2(10s分檔 | -c總分 | “-c”修改系數 | 正確性分 | 性能分1(10s | "性能分2(60s,300s" | -s總分 | “-s”修改系數 | 總分 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 14011100 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
| 2 | 14061213 | 10 | 1.25 | 0 | 11.25 | 1 | 10 | 1.25 | 0 | 11.25 | 1 | 22.5 |
| 3 | 15061067 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 28.75 |
| 4 | 15061069 | 0 | 0 | 0 | 0 | 1 | 10 | 1.25 | 0 | 11.25 | 1 | 11.25 |
| 5 | 15061074 | 4 | 0 | 0 | 4 | 0.9 | 10 | 1.25 | 1 | 12.25 | 1 | 15.85 |
| 6 | 15061075 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 27.5 |
| 7 | 15061077 | 10 | 0 | 0 | 10 | 1 | 10 | 0 | 0 | 10 | 0.8 | 18 |
| 8 | 15061080 | 10 | 0 | 0 | 10 | 1 | 10 | 1.25 | 1 | 12.25 | 1 | 22.25 |
| 9 | 15061085 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
| 10 | 15061101 | 4 | 0 | 0 | 4 | 1 | 2 | 0 | 0 | 2 | 1 | 6 |
| 11 | 15061104 | 10 | 1.25 | 0 | 11.25 | 1 | 10 | 0 | 0 | 10 | 1 | 21.25 |
| 12 | 15061111 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 1.25 | 1.25 | 12.5 | 1 | 26.25 |
| 13 | 15061119 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
| 14 | 15061122 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
| 15 | 15061129 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 0.9 | 27.375 |
| 16 | 15061132 | 10 | 2.5 | 0 | 12.5 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 26.25 |
| 17 | 15061144 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
| 18 | 15061151 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 1.25 | 0 | 11.25 | 1 | 25 |
| 19 | 15061175 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
| 20 | 15061180 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
| 21 | 15061183 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
| 22 | 15061186 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
| 23 | 15061187 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
| 24 | 15061188 | 10 | 0 | 0 | 10 | 0.9 | 10 | 1.25 | 1 | 12.25 | 1 | 21.25 |
| 25 | 15061189 | 10 | 2.5 | 2.5 | 15 | 0.9 | 10 | 1.25 | 0 | 11.25 | 0.9 | 23.625 |
| 26 | 15061199 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
| 27 | 15231058 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
| 28 | 15231177 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 1.25 | 0 | 11.25 | 0.9 | 23.875 |
| 29 | 15231196 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
| 30 | 15271106 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
五、總分
| INDEX | 作業地址 | 博客分數 | Github | 自動測試得分 | 錯誤處理 | 附加題 | 總分(不計附加 | 總分 |
|---|---|---|---|---|---|---|---|---|
| 1 | 14011100 | 14 | 2 | 30 | 3 | 5 | 49 | 54 |
| 2 | 14061213 | 11 | 2 | 22.5 | 2.5 | 5 | 38 | 43 |
| 3 | 15061067 | 10 | 2 | 28.75 | 2 | 0 | 42.75 | 42.75 |
| 4 | 15061069 | 12.5 | 0 | 11.25 | 3 | 0 | 26.75 | 26.75 |
| 5 | 15061074 | 13 | 2 | 15.85 | 3 | 5 | 33.85 | 38.85 |
| 6 | 15061075 | 12 | 0 | 27.5 | 3 | 0 | 42.5 | 42.5 |
| 7 | 15061077 | 9 | 1 | 18 | 2.5 | 0 | 30.5 | 30.5 |
| 8 | 15061080 | 12 | 0 | 22.25 | 3 | 0 | 37.25 | 37.25 |
| 9 | 15061085 | 3 | 0 | 0 | 2 | 0 | 5 | 5 |
| 10 | 15061101 | 10 | 0 | 6 | 3 | 0 | 19 | 19 |
| 11 | 15061104 | 11.5 | 1 | 21.25 | 0.5 | 0 | 34.25 | 34.25 |
| 12 | 15061111 | 12 | 2 | 26.25 | 3 | 0 | 43.25 | 43.25 |
| 13 | 15061119 | 12 | 2 | 28.75 | 3 | 0 | 45.75 | 45.75 |
| 14 | 15061122 | 14.5 | 2 | 28.75 | 3 | 0 | 48.25 | 48.25 |
| 15 | 15061129 | 14.5 | 2 | 27.375 | 2.5 | 0 | 46.375 | 46.375 |
| 16 | 15061132 | 13 | 0 | 26.25 | 3 | 0 | 42.25 | 42.25 |
| 17 | 15061144 | 14 | 2 | 30 | 3 | 0 | 49 | 49 |
| 18 | 15061151 | 12.5 | 0 | 25 | 3 | 0 | 40.5 | 40.5 |
| 19 | 15061175 | 12 | 2 | 30 | 1.5 | 0 | 45.5 | 45.5 |
| 20 | 15061180 | 13 | 2 | 30 | 3 | 0 | 48 | 48 |
| 21 | 15061183 | 15 | 2 | 30 | 3 | 5 | 50 | 55 |
| 22 | 15061186 | 12 | 1 | 28.75 | 3 | 0 | 44.75 | 44.75 |
| 23 | 15061187 | 13.5 | 1 | 28.75 | 3 | 5 | 46.25 | 51.25 |
| 24 | 15061188 | 13 | 2 | 21.25 | 3 | 0 | 39.25 | 39.25 |
| 25 | 15061189 | 14 | 1 | 23.625 | 2 | 0 | 40.625 | 40.625 |
| 26 | 15061199 | 15 | 2 | 28.75 | 0 | 5 | 45.75 | 50.75 |
| 27 | 15231058 | 12.5 | 0 | 30 | 3 | 0 | 45.5 | 45.5 |
| 28 | 15231177 | 12.5 | 2 | 23.875 | 2.5 | 0 | 40.875 | 40.875 |
| 29 | 15231196 | 13 | 2 | 28.75 | 2.5 | 0 | 46.25 | 46.25 |
| 30 | 15271106 | 13.5 | 2 | 28.75 | 3 | 0 | 47.25 | 47.25 |
六、一些問題
1.晚交、錯交
本次作業有兩位同學在截止日期后才交上作業,原因分別是:
- xxx同學:完成了程序與博客,忘記在班級博客中提交。
- xx同學:完成了程序與博客,卻提交至個人作業week1中。
希望大家以后能注意:D
2.正確性測試
大家出乎意料的,程序效率都很高,但是第一輪測試之后也暴露了不少問題:
2.1審題出現了問題:
- 左上角固定數字出錯
2.2程序魯棒性問題:
- 若題目文件最后一個題目的最后一個數字后有兩個回車,則會多輸出一個自己生成的數獨;若只有一個回車,則正常
- 若題目文件最后一個題目的最后一個數字后只有有一個個回車,則不會求解最后一題;若有兩個個回車,則正常
- 若題目文件最后一個題目的最后一個數字后有兩個回車,則程序崩潰,若只有一個回車,則正常
2.3出題者的問題:
- 作業在要求時沒有明確說明生成文件時是追加在原文件后還是覆蓋原文件
這主要是我的問題,但希望下次對題目有異議時,請聯系助教或老師:D
2.4程序算法的問題:
- 有幾個同學在測試大數時生成了重復的數獨
正如某位同學在更正了程序之后在博客中說的一樣:
這就是多寫一個測試程序的事
因此,我建議不論你的算法是否能從原理上避免重復數獨,最好進行一下相關測試。這樣你也安心,我也省事,不是很好嗎:D
然后我猜有人問:“助教,我不知道怎么判重,兩個兩個比較太麻煩了”
這里根據同學們的博客整理三種判重的方法:
- 使用hashset暴力判重
- 使用字典樹進行判重
- 將一個數獨打成長度為81的字符串,然后每17位一組變成6個long long,排序之后進行判重
不管你是否還用得到,學習一下別人的思路,也是極好的:D
3.性能測試
這次性能測試使用的題目是我自己生成的,然后從生成的終局中隨機挖掉一半的空。
也就是說這個測試樣例實際上是對一些朴素的算法,比如回溯法,是相當友好的。
后來某位同學給了我一份含有49121個只有17個已確定的數字的數獨,於是我又測了一遍,結果是這樣的,大家隨意感受一下:

我沒有否認大家的算法和優化,畢竟這次測試並沒有算分,而且大多數同學都在自動測試的部分得到了較高的分數。這次測試主要體現了大家的程序是否能在極端情況下正常地工作。因此在這里對通過了這個測試的同學提出表揚:D,其他同學也不要氣餒,畢竟你們的程序也很好地完成了基礎的要求:D
4.錯誤處理
錯誤處理測試了這六個參數,每個0.5分:
- "-c"
- "-c -100"
- "(空參數"
- "-c 1000000000000000"
- "-abc"
- "-c asd"
雖然大多數同學都拿到了錯誤處理的分數,但是有那么些問題:
- 對錯誤的分類處理出了問題,導致不同的錯誤得到了相同的反饋
- 反饋結果讓人莫名其妙
- 沒有反饋
- 直接崩潰
錯誤處理做得越好,用戶體驗就越好。希望大家能重視。
這里表揚一下:
15061074
15061186
14061213
這三個同學的錯誤處理,[捂臉]但是因為他們博客里沒有錯誤處理的部分,所以我這里推薦一下福大鄭浩輝同學的博客作為他山之石:
這是他的錯誤提示:
-【開始校驗參數】【校驗參數中】請輸入生成數量
-【開始校驗參數】【校驗參數中】生成數量只能是數字
-【未知指令】試試 -help ?
-【請輸入指令及相關參數】試試 -help ?
-【開始校驗參數】【校驗參數中】請勿輸入多余參數
同時鄭同學的博客排版美觀,思路清晰,建議大家去學習一下。鏈接:http://www.cnblogs.com/andwho/p/7500515.html
5.Github提交規范
這次提交的作業里,有這種畫風的:

還有這種畫風的:

本次作業要求的是“代碼有進展即簽入”稍有出入,也就是說,簽入記錄大體上應該是這樣的:

以下摘自:[福大軟工] Z班 第2次成績排行榜
這是陳翔同學的博客:他的項目不僅有完整的運行說明,可讀的commit信息注釋,恰當的commit頻率,還配置了集成測試。這個簡直是一份完美的Github項目范例,推薦給各位同學。鏈接:http://www.cnblogs.com/qq952693358/p/7487056.html
這里推薦大家學習福州大學的陳翔同學整理的Github提交規范心得:D
https://github.com/Wasdns/github-example-repo
七、一些總結
1.算法
同學們使用的算法大概有這幾種:
- 隨機+回溯
- 行列變換
- 數字重新映射
- DLX
在中小數據上,隨機產生與回溯的方法較為簡單同學們優化做得太好了導致中小數據上看不出差別[捂臉]。部分同學使用了生成等價數獨的方法,這個方法的好處是從根本上避免了重復數獨的出現(盡管一些同學出現了重復的問題);同時也有同學考慮到求解和生成終局實際上可以使用同一個算法來解,這是也一個很好的思路。
2.優化
同學們進行的優化大概有這么幾種:
- DEBUG -> RELEASE
- 優化IO
- 優化算法
第一個改進是最容易的,在生成時使用RELEASE模式而不是DEBUG模式。
簡單說一下這兩個模式的區別:
你們編譯課大概在下半個學期會學到“編譯優化”的部分(包括循環優化,控制優化,活躍變量分析等)。在DEBUG模式下編譯器是不會對程序做優化的,但是RELEASE模式下會,但是編譯速度會受到影響。
感興趣的同學可以參看:DEBUG和RELEASE模式的區別
第二個則是大多數同學都會進行的優化,比較簡單,而且修改幅度也不大,大致有以下的方法:
- 1.一次輸出一個數->一次輸出一個終局->把終局存起來一次性輸出
- 2.使用string->使用字符數組
- 3.使用 ofstream 與 << ->使用fwrite,fprint
第一種方法減少了IO次數,第二、三種方法使用了底層的數據類型或方法,減少了開銷,因此會使性能大大上升
第三個則是算法的優化,這里不再贅述
3.推薦博客
15061183-[2017BUAA軟工]個人項目-數獨
15061189-個人項目-數獨
15061129-[2017BUAA軟工]第一次個人項目 數獨的生成與求解
15061122-個人作業 數獨
