ZJU-1091改進

 

今天還是1091,國際象棋的騎士走日,在兩個點上的最短路徑。
按說方法區別不大,因爲和上一篇中用的算法基本一樣,依然是BFS,但是這個程序速度和內存佔用都比上一個提高很多。
爲什麼呢?原因是這樣子的,種種跡象表明,OJ上的測試數據量很大的,所以如果對於同一個起點有很多個測試數據的話,不如首先將[i,j]爲起點的所有點在圖上BFS,並且對應每個終點的最短路徑直接就存在map[i][j][endx][endy]
這樣得到輸入數據以後,直接查表輸出即可,避免了大量的重複運算。
另外因爲輸入輸出改爲純C,速度也有提高,昨天犯的錯誤非常低級,我試圖用長度爲2的字符串數組輸入長度爲2的字符串,這種情況下,windows下用VC應該是編譯器自動補上了這個沒有結尾的字符串數組,而在linux的G++下,編譯器沒有這個動作,造成錯誤,而且很不明顯。穩妥的做法是用長度爲n+1的字符串數組輸入最大長度爲n的字符串。
當然,如果用C++下的string型,就更爲穩妥了,可以避免這種在實際中難以察覺的錯誤。

在網上搜到有人用DFS做1091,不是不可以,但是用DFS顯然不是出題者的意圖,這道題考察的就是無權重的有向圖的最短路徑,第一反映就應該是BFS。

 

 

發佈了68 篇原創文章 · 獲贊 26 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章