不解釋,bfs
問題描述
學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋這件事情,於是就委託你幫他找一條最短的路線。
輸入格式
第一行兩個整數n, m,為迷宮的長寬。
接下來n行,每行m個數,數之間沒有間隔,為0或1中的乙個。0表示這個格仔可以通過,1表示不可以。假設你現在已經在迷宮座標(1,1)的地方,即左上角,迷宮的出口在(n,m)。每次移動時只能向上下左右4個方向移動到另外乙個可以通過的格仔裡,每次移動算一步。資料保證(1,1),(n,m)可以通過。
輸出格式
第一行乙個數為需要的最少步數k。
第二行k個字元,每個字元∈,分別表示上下左右。如果有多條長度相同的最短路徑,選擇在此表示方法下字典序最小的乙個。
樣例輸入
input sample 1:
3 3
001
100
110
input sample 2:
3 3
000
000
000
樣例輸出
output sample 1:
4
rdrd
output sample 2:
4
ddrr
資料規模和約定
有20%的資料滿足:1<=n,m<=10
有50%的資料滿足:1<=n,m<=50
有100%的資料滿足:1<=n,m<=500。
#include#include#includeusing namespace std;
int dis[502][502]=,n,m,dir[4][2]=,pre[502][502];
char a[502][502];
void huisu(int t1,int t2)
if(pre[t1][t2]==1)
if(pre[t1][t2]==2)
if(pre[t1][t2]==3)
}int main(){
cin>>n>>m;
for(int i=0;i>a[i];
a[0][0]='1';
queueq1;
queueq2;
q1.push(0);
q2.push(0);
dis[0][0]=0;
while(!q1.empty()){
int t1=q1.front(),t2=q2.front();
if(t1==n-1&&t2==m-1) break;
q1.pop();
q2.pop();
for(int i=0;i<4;i++){
int t3=t1+dir[i][0],t4=t2+dir[i][1];
if(t3>=0&&t3=0&&t4
演算法提高 學霸的迷宮
問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋...
演算法提高 學霸的迷宮
問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋...
演算法提高 學霸的迷宮
問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋...