生活随笔
收集整理的這篇文章主要介紹了
实现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;?????????????????? ?? 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;??????????????????? ?? 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])?? ????????????????{?? ????????????????????mintime[x][y]?=?next.time;?? ????????????????????Q.push(next);?? ????????????????}?? ????????????}?? ????????}?? ????}?? ????return?mintime[ax][ay];?? }?? ?? int?main()?? {?? ????int?i,?j;?? ????int?fx,?fy;??????? ????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之“营救”的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。