Re: [問題] ACM Q10189 - Minesweepe

作者: s25g5d4 (function(){})()   2014-11-10 23:14:12
這題我看過,本來我以為我寫過結果沒有
所以花了一點時間寫一份...當然我不會貼上來 :P
幾個建議:
1. include stdio.h 建議寫成 cstdio 比較符合 C++ 慣例
2. cin 與 scanf 不要混用
因為兩者視 implement 不同,混用會有神奇的 bug 出現
cout 與 printf 也是一樣的不要混用
可能有人會告訴你 scanf, printf 比較快之類的
不過我比較傾向哪個熟練就用哪個
3. 陣列初始化可以參考 cstring (string.h) 的 memset
這個函數可以一次把一整塊記憶體空間歸零
比你用迴圈慢慢跑還快
4. 用 cin 讀取時要注意把 \n (換行字元) 吃進來丟掉
4 4\n
*...\n
....\n
.*..\n
....\n
這個測資用 cin 把 4 4 讀進來以後後面的 \n 要記得把它吃進來丟掉
像這樣:
cin >> row >> col;
cin.ignore(); // 把換行從 stdin 中移除(忽略)
5. 既然要用字元陣列存,可以去查查 cin.getline() 一次讀一整行
這個函數會把換行自動吃掉而且不會存到陣列中
6. 程式主要邏輯上建議改成「遇到地雷就把八個方向的鄰格數字 +1」
而不是「每一非地雷格都檢查附近有幾顆地雷」
這樣會少跑好幾次迴圈,效能比較好
所以這樣的話一開始要把整個陣列初始化為全填零
然後開始一格一格掃,遇到地雷就把鄰格 +1, 並且把地雷那格標上記號
這邊有個小技巧就是因為每格非地雷數字最多就 8 了
所以只要大於 8 的數字就是地雷
也就是說地雷那一格直接把數字填 9 就好
遇到相鄰的地雷也不用特別判斷,直接 +1
因為地雷一定大於8, 再 +1 還是地雷
7. 根據剛剛 AC 的結果來看,輸出格式應該是這樣:
Field #1:\n
*100\n
2210\n
1*10\n
1110\n
\n
Field #2:\n
**100\n
33200\n
1*100\n
所以每一行輸出都要有換行,每組輸出中間有一空白行

Links booklink

Contact Us: admin [ a t ] ucptt.com