廣度優先演算法 越獄

2021-07-05 07:20:06 字數 1978 閱讀 9340

建築師麥可為了救含冤入獄的哥哥,自己也想辦法進了監獄。現在他找到了哥哥,想帶著哥哥越獄。

可是監獄地形複雜,還有一道道的電網攔在面前。

電網非常危險,不到無路可走,麥可都不想嘗試鑽過電網。

請幫麥可兄弟設計一條穿過電網最少的路線。

(只能往相鄰的四個方向前進)

第一行: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。廣度優先搜尋的思想 訪問頂...