Re: [問題] ACM Q10189 - Minesweepe

看板C_and_CPP作者 (function{}())時間10年前 (2014/11/10 23:14), 10年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
這題我看過,本來我以為我寫過結果沒有 所以花了一點時間寫一份...當然我不會貼上來 :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 所以每一行輸出都要有換行,每組輸出中間有一空白行 -- 小弟的 UVa profile http://uhunt.felix-halim.net/id/406138 --

11/06 05:20,
五樓閃尿
11/06 05:20

11/06 05:21,
超☆快速蓋
11/06 05:21

11/06 05:21,
超☆快速蓋蓋
11/06 05:21

11/06 05:21,
超☆快速蓋蓋蓋
11/06 05:21

11/06 05:21,
冒險蓋
11/06 05:21
obov:幹拎娘插三小 obov:連閃尿都要插 11/06 05:22 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.205.159 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1415632457.A.DF2.html ※ 編輯: s25g5d4 (140.117.205.159), 11/10/2014 23:17:50
文章代碼(AID): #1KODP9to (C_and_CPP)
文章代碼(AID): #1KODP9to (C_and_CPP)