走迷宮問題就是裸的廣搜,即使加了傳送門也只是搜尋時稍作改動。
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 就將該父節點作為新的隊尾繼續呼叫 這...