藍橋杯 學霸迷宮問題

2021-10-19 07:23:01 字數 1884 閱讀 4398

問題描述

學霸搶走了大家的作業,班長為了幫同學們找回 作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨 刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋這件事情,於是就委託你幫他找一條最短的路 線。

輸入格式

第一行兩個整數n, m,為迷宮的長寬。

接下來n行,每行m個數,數之間沒有間隔,為0或1中的乙個。0表示這個格仔可以通過,1表示不可以。假設你現在已經在迷宮座標(1,1)的地方,即 左上角,迷宮的出口在(n,m)。每次移動時只能向上下左右4個方向移動到另外乙個可以通過的格仔裡,每次移動算一步。資料保證(1,1),(n,m)可 以通過。

輸出格式

第一行乙個數為需要的最少步數k。

第二行k個字元,每個字元∈,分別表示上下左右。如果有多條長度相同的最短路徑,選擇在此表示方法下字典序最小的乙個。

樣例輸入

input sample 1:

3 3001

100110

input sample 2:

3 3000

000000

樣例輸出

output sample 1:

4rdrd

output sample 2:

4ddrr

資料規模和約定

有20%的資料滿足:1<=n,m<=10

有50%的資料滿足:1<=n,m<=50

有100%的資料滿足:1<=n,m<=500。

老師給的答案如下,供參考

#include

#include

using

namespace std;

#define m 500

#define n 500

//上下左右udlr,按字典序排是dlru,即下左右上,所以d陣列調整了一下

const

int d[

2]=;

string h=

"dlru"

;bool maze[m]

[n];

//位置點的狀態,0表示通道,1表示牆

bool visited[m]

[n];

//標誌著該點是否被訪問到了

int m,n;

//迷宮的實際行數和列數

struct point //結構體,表示位置點

;point pre[m]

[n];

//記錄了到達本點前一步的那個點的座標

int step;

string s="";

void

print_path

(point p)

//遞迴列印路徑

print_path

(pre[p.x]

[p.y]);

step++

; s+

=p.c;

}void

bfs(

)//廣度優先演算法bfs

; visited[0]

[0]=

true

;//入口點被訪問

q.push

(p);

///入口點入隊

while

(!q.

empty()

)//當佇列不為空時

for(

int i=

0; i<

4; i++);

q.push

(p);

//入隊}}

}}intmain()

}bfs()

; cout

}

藍橋杯 學霸的迷宮

演算法提高 學霸的迷宮 時間限制 1.0s 記憶體限制 256.0mb 問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從...

藍橋杯 學霸的迷宮

演算法提高 學霸的迷宮 時間限制 1.0s 記憶體限制 256.0mb 問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從...

藍橋杯 學霸的迷宮

問題描述 學霸搶走了大家的作業,班長為了幫同學們找回作業,決定去找學霸決鬥。但學霸為了不要別人打擾,住在乙個城堡裡,城堡外面是乙個二維的格仔迷宮,要進城堡必須得先通過迷宮。因為班長還有妹子要陪,磨刀不誤砍柴功,他為了節約時間,從線人那裡搞到了迷宮的地圖,準備提前計算最短的路線。可是他現在正向妹子解釋...