演算法提高 學霸的迷宮

2021-08-07 03:38:20 字數 2395 閱讀 5241

演算法提高 學霸的迷宮  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

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

輸入格式

第一行兩個整數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: 4

rdrd

output sample 2: 4

ddrr

資料規模和約定

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

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

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

借用原創作者思路,經典dfs演算法+路徑記錄
#include#includeusing namespace std;

struct nodepre[501][501];

int ans=0;

int a[501][501];

int v[501][501]=;

int n,m;

int dir[4][2]=;//d-l-r-u 規律去探索最短路徑.(因為最短路徑要是字典最小的)

//這裡已經用了貪心思維。每次在當前位置找下乙個位置的去向,往往都從d開始然後到l-r-u,入隊是從d入隊,

//如果當前位置有多個地方可走,那麼肯定是最小方向先入隊,先入隊的先探索原則,後入隊的後探索,

//當前位置探索完之後,到下乙個位置即隊首,隊首記錄的是先入隊的,所以先入隊的位置先探索!

/*例1:0011

0001

0100

0000

最佳路徑:dddrrr,可相信簡單的想一下,有乙個水龍頭在(1,1)的位置扭開,水首先充滿下面,然後左右,再到上.

第二條路徑也有但是它只進行到終點之前便因為最佳路徑已經先快一步到達而結束.

rdrdr(d)在到達終點之前結束(d)是未完成的一步,如果這步先完成,那麼這個路徑比起最佳路徑字典大!

例2: 0011

0001

0100

0010

最佳路徑:drrdrd 可便於理解分叉路思路,若當前位置可走有2個位置,即二分叉路口,先考慮可使得路徑字典最小的走法

然後到達下乙個位置之後依然存在分叉路,依然這樣思考,直到遇到不存在分叉路,就返回前乙個位置,直至到有分叉路的地方繼續這樣迴圈。

ps:當前位置可走情況為1~4,分叉路口即為可走情況。

*/

bool check(int x,int y)

void dfs(int bx,int by)

if(check(next.x,next.y))//每一次判斷下乙個點是否可以進入

}} ans = -1;//處理無法到達(n,m)的情況為-1

}void print_road(int x,int y)//遞迴找根,找到根的第二個點,進行當前位置與前乙個位置比較判斷是如何走! 然後輸出

else if(x==pre[x][y].x && ypre[x][y].x && y==pre[x][y].y)//下

else if(x>n>>m;

int i,j;

char c[501][501];

for(i=1;i<=n;i++)//先用char 二維陣列c去儲存輸入數制

cin>>c[i];

for(i=1;i<=n;i++)//將c 轉化為int 二維陣列a

for(j=1;j<=m;j++)

a[i][j]=c[i][j-1]-'0';

pre[1][1].x=pre[1][1].y=-1;

dfs(1,1);

cout

cout

}

演算法提高 學霸的迷宮

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

演算法提高 學霸的迷宮

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

演算法提高 學霸的迷宮

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