日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实现BFS之“营救”

發布時間:2025/6/15 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现BFS之“营救” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

廣度優先遍歷(Breadth First Search,BFS)是一個分層的搜索過程,沒有回退過程,是非遞歸的。


DFS與BFS的小秘密:

1、深度優先搜索算法的思路很簡單,比較好理解,但得到的解不是最優的;而廣度優先搜索則恰恰相反;

2、如果節點有無窮多個,深度優先搜索算法在某處分支可以無限搜索下去卻找不到解,這時我們可以采用有界深度優先搜索~


題目來源:

ZOJ Monthly,October 2003,ZOJ1649

題目描述:

Angel被MOLIGPY抓住了,她被關在監獄里。監獄可以用一個N*M的矩陣來描述,1<N、M<=200。監獄由N*M個格子組成,每個方格中可能為墻壁、道路、警衛、Angel或Angel的朋友。Angel的朋友想去營救Angel。他的任務是接近Angel。約定“接近Angel”的意思是到達Angel被關的位置。如果Angel的朋友想到達某個方格,但方格中有警衛,那么必須殺死警衛,才能到達這個方格。假定Angel的朋友向上、下、左、右移動一步用時1個單位時間,殺死警衛也用時1個單位時間。假定Angel的朋友可以殺死所有警衛。

試計算Angel的朋友接近Angel至少需要多長時間,只能向上、下、左、右移動,而且墻壁不能通過。

輸入描述:

輸入文件中包含多個測試數據。每個測試數據的第1行為兩個整數N和M,接下來有N行,每行有M個字符:"."代表道路,"a"代表Angel,"r"代表Angel的朋友,"#"代表墻壁,"x"代表警衛。

輸出描述:

對每組測試數據,輸出一個整數,表示接近Angel所需最少時間。如果無法接近Angel,則輸出"Poor ANGEL has to stay in the prison all his life."。

樣例輸入:

7 8

#.#####.

#a.#xr..

#.x#xx..

..xxxx.#

#.......

.#......

........

樣例輸出:

12


閑話少敘,奉上代碼+注釋~

Code:

[cpp]?view plaincopyprint?
  • #include<iostream>??
  • #include<queue>??
  • using?namespace?std;??
  • ??
  • #define?MAXN?200??
  • #define?INF?1000000??
  • ??
  • struct?point??
  • {??
  • ????int?x,?y;???????????????//記錄點的坐標??
  • ????int?step;???????????????//記錄到達當前點所用步數??
  • ????int?time;???????????????//記錄到達當前點所用時間??
  • };??
  • ??
  • queue<point>Q;????????????????//想法:用隊列存儲BFS遍歷的節點,隊頭為當前所處位置,把所有遍歷到新的節點插入隊尾??
  • ??
  • char?map[MAXN][MAXN];???????//地圖??
  • int?mintime[MAXN][MAXN];????//到達每個點所用時間??
  • int?dir[4][2]?=?{?{-1,?0},?{0,?1},?{1,?0},?{0,?-1}?};???//四個方向:上右下左??
  • int?N,?M;???????????????????//監獄的大小??
  • int?ax,?ay;?????????????????//Angel所在位置??
  • ??
  • int?BFS(point?start)??
  • {??
  • ????int?i;??
  • ????Q.push(start);??????????//將頂點入隊??
  • ????point?head;?????????????//定義一個當前點??
  • ????while(!Q.empty())??
  • ????{??
  • ????????head?=?Q.front();???//獲取隊頭點,即當前點??
  • ????????Q.pop();????????????//獲取后隨即彈出,為后面的操作做預處理??
  • ????????for(i?=?0;?i?<?4;?i++)??
  • ????????{??
  • ????????????int?x?=?head.x?+?dir[i][0],?y?=?head.y?+?dir[i][1];?????//獲取下一個方向上的坐標??
  • ????????????if(x>=0?&&?x<N?&&?y>=0?&&?y<M?&&?map[x][y]?!=?'#')??????//排除越界和墻壁的情況??
  • ????????????{???//獲取下一個點的全部信息??
  • ????????????????point?next;??
  • ????????????????next.x?=?x;??
  • ????????????????next.y?=?y;??
  • ????????????????next.step?=?head.step?+?1;??
  • ????????????????next.time?=?head.time?+?1;??
  • ????????????????if(map[x][y]?==?'x')?next.time++;???//如果遇到敵人,多消耗一個時間??
  • ????????????????//比較時間,選擇用時最短的位置入隊并作為下一次遍歷的起點~??
  • ????????????????if(next.time?<?mintime[x][y])??
  • ????????????????{//此處有兩個作用:1、比較哪個路徑對應的時間最小,并入隊;2、標記上一個點,使其不可回退。??
  • ????????????????????mintime[x][y]?=?next.time;??
  • ????????????????????Q.push(next);??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????return?mintime[ax][ay];??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?i,?j;??
  • ????int?fx,?fy;?????//Angel的朋友的坐標??
  • ????while(scanf("%d%d",?&N,?&M)?!=?EOF)??
  • ????{??
  • ????????memset(map,?0,?sizeof(map));????????//初始化大地圖??
  • ????????for(i?=?0;?i?<?N;?i++)?scanf("%s",?map[i]);??????//確立監獄信息??
  • ????????for(i?=?0;?i?<?N;?i++)???
  • ????????????for(j?=?0;?j?<?M;?j++)???
  • ????????????{??
  • ????????????????mintime[i][j]?=?INF;????????//初始化時間為無窮大??
  • ????????????????if(map[i][j]?==?'r')?{?fx?=?i;?fy?=?j;?}??
  • ????????????????else?if(map[i][j]?==?'a')?{?ax?=?i;?ay?=?j;?}??
  • ????????????}??
  • ????????point?start;??
  • ????????start.x?=?fx;?start.y?=?fy;??
  • ????????start.step?=?start.time?=?0;??
  • ????????mintime[fx][fy]?=?0;??
  • ????????int?mint?=?BFS(start);??
  • ????????if(mint?<?INF)?printf("%d\n",?mint);??
  • ????????else?printf("Poor?ANGEL?has?to?stay?in?the?prison?all?his?life.\n");??
  • ????}??
  • ????return?0;??
  • }??
  • 運行結果:


    Ps:如有Bug,歡迎拍磚~

    總結

    以上是生活随笔為你收集整理的实现BFS之“营救”的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。