題意:joe被困在迷宮中,可以從邊界逃出,但迷宮中有火,火和joe同時移動,問joe能否逃出迷宮。
解題思路:
該題看起來很困難,因為我們可能會想到兩個bfs搜尋同時進行,
如果這樣就不知道從何處理了。因為這相當於兩條盲驢亂撞,很難求出結果。
那麼,我們是否可以先進行乙個再進行另乙個呢?
顯然是可以的,因為我們關鍵是要讓joe逃出迷宮,如果我是預言家,我先前就知道了火到達迷宮中各個點的時間,那麼火和joe同時燒,joe不就可以根據火等等種種因素來判斷行徑嗎?
所以,我們可以設定乙個二維陣列儲存每個點火燒到的時間,當然,對於無法燒到的點我們設定其時間為無窮大
int times[maxn][maxn];
那麼,通過對火bfs搜尋記錄每個點火燒到的時間,再通過這個去判斷joe能不能被火燒到,即joe走到某點的時間如果小於times[x][y]
那麼說明不會被燒到。ok,以此對joe進行一趟bfs搜尋。則易解。
ps:一定一定要清空佇列,一定一定要初始化陣列,還有最重要的一點:火種不只是只有乙個,可能有多個火種,即我們要進行多源點bfs搜尋。
ac**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
1002
;//迷宮的最大尺寸。
const
int inf=
0x3f3f3f3f
;//表示無窮大
char maze[maxn]
[maxn]
;//迷宮
bool visited[maxn]
[maxn]
;int go[4]
[2]=
,,,}
;//代表操作行為。
int t,r,c;
//t組測試用例,迷宮大小為r*c;
typedef
struct nodenode;
int times[maxn]
[maxn]
;//火燃燒到該點所需要消耗的時間。
queue q1;
node fire,temp;
bool
check_fire
(int x,
int y)
intbfs_fire()
}}return0;
}bool
check_joe
(node temp)
intbfs_joe
(node joe)
for(
int i=
0;i<
4;i++)}
}printf
("impossible\n");
return0;
}int
main()
else
if(maze[i]
[j]==
'f')}}
bfs_fire()
;memset
(visited,
false
,sizeof
(visited));
//重置輔助陣列,供joe判斷。
bfs_joe
(joe);}
}return0;
}
廣度搜尋bfs
廣度搜尋在acm中應用十分廣泛,英文簡寫是bfs breadth first search 下面先看一下例子 在乙個4 4的矩形中,有一些位置設定有障礙,要求從 1,1 走到 4,4 求最短距離。分析 假設沒有任何障礙,我們可以走的路線如下 起點為 1,1 假設這一步是第一步可以到達的位置 然後它可...
寬度優先搜尋BFS
寬度優先搜尋 bfs,breadth first search 也是搜尋的手段之一。它與深度優先搜尋類似,從某個狀態出發探索所有可以到達的狀態。與深度優先搜尋的不同之處在於搜尋的順序,寬度優先搜尋總是先搜尋距離初始狀態近的狀態。也就是說,它是按照開始狀態 只需1次轉移就可以到達的所有狀態 只需2次轉...
BFS廣度優先搜尋
廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...