建築師麥可為了救含冤入獄的哥哥,自己也想辦法進了監獄。現在他找到了哥哥,想帶著哥哥越獄。
可是監獄地形複雜,還有一道道的電網攔在面前。
電網非常危險,不到無路可走,麥可都不想嘗試鑽過電網。
請幫麥可兄弟設計一條穿過電網最少的路線。
(只能往相鄰的四個方向前進)
第一行:n,表示地圖的大小(10 <= n <= 1000)
接下來n行n列,表示地圖,1表示有電網,0表示沒有,以空格隔開。
起點(1,1) 和終點(n, n) 一定沒有電網。
求到達終點最少穿過的電網數。
需要注意的是,穿越緊挨在一起的兩個1,是穿過了兩道電網,而不是穿過了「1道厚度為2的電網」。
100 0 0 0 1 1 0 1 1 1
1 0 1 0 1 0 1 1 0 1
0 0 0 0 1 0 1 0 1 1
1 1 1 1 1 1 0 1 1 0
1 0 0 0 0 0 0 1 1 0
0 0 1 1 1 1 1 1 0 0
0 0 1 0 0 0 0 1 1 1
0 0 0 0 1 0 0 0 0 0
1 0 0 1 1 1 0 1 1 1
0 1 0 0 0 0 1 0 1 0
這題的資料量比較大,達到1000,假如使用dfs,光沿著邊走,就已經到達2000,遞迴達到2000層,棧是絕對會爆的。
所以這題考慮使用bfs進行遍歷。而思路則是,一開始找出被1包圍的區域,走到無路可走時,進行突破,result+1;
突破之後繼續尋找下乙個被1包圍的區域,直到到達終點。
具體做法則是,使用雙佇列,乙個存放0,乙個存放1。在bfs的時候,把需要訪問的0放入0佇列,1放入1佇列。
當0隊列為空時,表示無路可走。這時清空0佇列,把1佇列資料轉移到0佇列作為下一次bfs的資料。如此迴圈直到訪問到右下角的終點
#include using namespace std;
#define max 1002
#define debug 0
typedef struct _node_ st_node;
int n;
char map[max][max];
int result = 0;
st_node list0[max*max]; //陣列太小會導致越界
st_node list1[max*max];
void bfs (st_node node) else if (i == 1) else if (i == 2) else if (i == 3)
if ( map[ tmp.x ][ tmp.y ] == 2 ) else if ( map[ tmp.x ][ tmp.y ] == 0 ) else if ( map[ tmp.x ][ tmp.y ] == 1 )
} if ( tail0 == head0 )
printf("\n");
}#endif
//將1佇列的資料複製到0佇列,作為下一次bfs的資料
for (int i = 0; i < head1; i++)
head0 = head1;
tail0 = head1 = 0;
} if (map[n][n] == 2)
break; }}
int main(int argc, char *argv)
int tmp = 0;
for ( int i = 1; i <= n; i++ )
} st_node node;
node.x = 1;
node.y = 1;
bfs(node);
printf("%d", result);
return 0;
}
廣度優先遍歷演算法
廣度優先搜尋 也稱寬度優先搜尋,縮寫bfs 是連通圖的一種遍歷策略。因為它的思想是從乙個頂點v0v0開始,輻射狀地優先遍歷其周圍較廣的區域,因此得名。一般可以用它做什麼呢?乙個最直觀經典的例子就是走迷宮,我們從起點開始,找出到終點的最短路程,很多最短路徑演算法就是基於廣度優先的思想成立的。type ...
深度優先演算法和廣度優先演算法
圖形的深度優先搜尋法 void dfs int current 主程式 建立圖形後,將遍歷內容印出.void main 邊線陣列 int i for i 1 i 8 i creategraph node,20 建立圖形 printf 圖形的鄰接鍊錶內容 n for i 1 i 8 i printf ...
演算法 廣度優先演算法和深度優先演算法
廣度 bfs 和深度 dfs 優先演算法這倆個演算法是圖論裡面非常重要的兩個遍歷的方法。下面乙個例子迷宮計算,如下圖 解釋 所謂廣度,就是一層一層的,向下遍歷,層層堵截,看下面這幅圖,我們如果要是廣度優先遍歷的話,我們的結果是v1 v2 v3 v4 v5 v6 v7 v8。廣度優先搜尋的思想 訪問頂...