[爆卦]踩地雷遞迴是什麼?優點缺點精華區懶人包

為什麼這篇踩地雷遞迴鄉民發文收入到精華區:因為在踩地雷遞迴這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者littleshan (我要加入劍道社!)看板C_and_CPP標題Re: [請益] 踩地雷的踩...


※ 引述《EdisonX (閉上眼的魚)》之銘言:
: (3) 關鍵在於 M$ 點到 0 的時候會自動再往外爆開,但這個怎麼做?
: 目前想法是,當遇到 0 的時候,開啟後,以 bfs 方向繼續往四個方向搜尋,
: 搜尋到非零的時候就停下來,
: void bfs(int x, int y)
: {
: if( map[x][y] == 0 && x>=0 && x<COL && y>=0 && y<ROW ) {
>0 <COL-1 >0 <ROW-1
不然會 out of range
: map[x][y]=9;
: bfs(x+1,y);
: bfs(x-1,y);
: bfs(x,y+1);
: bfs(x,y-1);
另外這邊應該是八個方向下去 search

: }
: }
: 想試問在 (3) 之關鍵處是否合理?或是有其他方法做 往外爆開?
很合理的做法

: 另一個問題是,該格周圍有幾顆地雷,用事先算好方式會較佳嗎?
: 還是當 player 點開的時候再做處理會較佳?
: ( 是想問整體效能問題,直覺是先算好會較佳,
: 但如果地圖很大的話,在初始化的時間就... )
其實這很快
小畫家填色也是 flood fill
1000x1000 的圖片也是瞬間就填滿了

至於點開時再算 與事先計算
對使用者來說感覺不出差異的
尤其當你點開一格時如果有做動畫效果
播放動畫的時間遠大於計算周圍有幾顆地雷的時間

: 另外想額外問,有沒有書籍或文章,在講述,
: 怎麼以分析方式,
: 將 recursive 較有結構化方式、順序拿掉?
: 手邊有些程式很怕跑到 stack over flow
: 在此謝謝各位版友不吝賜教,小弟感激不盡。
recursive 改寫 loop 只有一句話而已
「把 recursive function 的參數和區域變數包起來塞進 stack」
多練習幾次就習慣了

不過我覺得要不要改 loop 這件事最好還是先分析一下遞迴深度
因為改寫通常意味著加入新 bug
而且 recursive 的寫法通常比較好閱讀也比較容易維護

另外現在的 compiler 其實都超強
VC、GCC 都可以做到 tail call optimization
甚至有些非 tail call 的情況都可以消除掉 recursion
像這個例子 http://ridiculousfish.com/blog/posts/will-it-optimize.html

所以結論就是先用最容易理解及維護的方式去寫code
真的有發生問題再去做調整



--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.3.139
MOONRAKER:現在CPU很快…XT時候flood fill都可以看到過程… 09/28 12:04
EdisonX:謝謝您的用心回答,解了我許多問題,另 if 那段確認一下, 09/28 17:35
EdisonX:if (x>= 0&& x<COL && y>=0 && y<ROW && !map[x][y]) 09/28 17:36
EdisonX:原本是要用 short-cut 避開 out-range,不過寫錯,改成上面 09/28 17:37
EdisonX:那樣應該就沒問題了吧? 感謝您 :) 09/28 17:37
littleshan:應該...吧?XD 10/01 10:03

你可能也想看看

搜尋相關網站