Hrbust 1613 迷宮問題(廣搜)

2021-08-15 16:36:31 字數 1942 閱讀 1995

走迷宮問題就是裸的廣搜,即使加了傳送門也只是搜尋時稍作改動。

z是起點,p是傳送門,#是障礙,w是出口。

問是否能從起點到出口,能的話輸出最少時間。

因為資料量較小,直接廣搜3遍,第一遍當沒有傳送門走一遍,得到乙個ans。

第二遍和第三遍分別從起點和重點開始搜,找到離自己最近的傳送門,最終求和,即可得到走傳送門的ans。

兩者取最小值即是到達的最小時間。

當裸搜走不到終點和走傳送門(起點走不出來終點也走不出來)的時候,即是無解,輸出impossible.

#include///不用判斷1*1的地圖

#include///資料量較小,分兩種情況,走傳送門和不走傳送門兩種情況,取最小時間作為ans

#include///走傳送門的情況 從起點搜到第乙個傳送門的時間+從終點往回搜到的第乙個傳送門的時間相加

using namespace std

;char ma[108][108];

bool vis[108][108];

int walkx= ;

int walky= ;

struct point

st,ed;

int main()

getchar();

}memset(vis,false,sizeof(vis));

bool flag=false;

queueq;

while(!q.empty())q.pop();

vis[st

.x][st

.y]=true;

st.ans=0

; int ans_1=0x7fffffff

; q.push(st);

while(!q.empty())

if(tmp.x>=0&&tmp.y>=0&&tmp.x

.y.x][tmp.y]&&ma[tmp.x][tmp.y]!='#')

}if(flag)break

; }

while(!q.empty())q.pop();

flag=false;

vis[ed.x][ed.y]=true;

ed.ans=0

; int ans_2=0x7fffffff

; q.push(ed);

while(!q.empty())

if(tmp.x>=0&&tmp.y>=0&&tmp.x

.y.x][tmp.y]&&ma[tmp.x][tmp.y]!='#')

}if(flag)break

; }

memset(vis,false,sizeof(vis));

while(!q.empty())q.pop();

flag=false;

vis[st

.x][st

.y]=true;

st.ans=0

; q.push(st);

int ans2=0x7fffffff

; while(!q.empty())

if(tmp.x>=0&&tmp.y>=0&&tmp.x

.y.x][tmp.y]&&ma[tmp.x][tmp.y]!='#')

}if(flag)break

; }

if((ans_1==0x7fffffff||ans_2==0x7fffffff)&&ans2==0x7fffffff)///從入口和出口兩邊搜的時候,注意如果有任何一邊搜不到傳送門說明傳送門根本走不通

printf("%d\n",ans_1+ans_2>ans2?ans2:ans_1+ans_2);}}

Hrbust 1613 迷宮問題(廣搜)

走迷宮問題就是裸的廣搜,即使加了傳送門也只是搜尋時稍作改動。z是起點,p是傳送門,是障礙,w是出口。問是否能從起點到出口,能的話輸出最少時間。因為資料量較小,直接廣搜3遍,第一遍當沒有傳送門走一遍,得到乙個ans。第二遍和第三遍分別從起點和重點開始搜,找到離自己最近的傳送門,最終求和,即可得到走傳送...

HRBUST 1613 迷宮問題 (bfs)

題幹 小z身處在乙個迷宮中,小z每分鐘可以走到上下左右四個方向的相鄰格之一。迷宮中有一些牆和障礙物。同時迷宮中也有一些傳送門,當小z走到任意乙個傳送門時,可以選擇傳送到其他任意的傳送門 傳送是不花費時間的 當然也可以停留在原地。現在小z想知道走出迷宮需要花費的最少時間。input 輸入第一行為組數t...

迷宮問題 廣搜

定義乙個二維陣列 int maze 5 5 queue 26 int head 0,tail 0,a 5 5 book 5 5 void function int tail 引數是隊尾 else function queue tail f 如果隊尾的父節點不是0 就將該父節點作為新的隊尾繼續呼叫 這...