演算法提高 學霸的迷宮 藍橋杯

2021-07-27 07:12:21 字數 2583 閱讀 4960

問題描述

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

輸入格式

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

我原來執行錯誤的**:

#include #include #include #includeusing namespace std;

#define max(a,b) ((a>b)?(a):(b))

int n,m;

char s[5]=;

int pos[510][510]=;

char revpro[500];

struct node

};queueq;

node*newnode()

void bfs()break;

case 'd':if(p->x+1<=n&&pos[p->x+1][p->y]!=1)break;

case 'l':if(p->y-1>=1&&pos[p->x][p->y-1]!=1)break;

case 'r':if(p->y+1<=m&&pos[p->x][p->y+1]!=1)break;}}

for(k=0;k<=3;k++)

}if(flag)break;

q.pop();

}printf("%d\n",p->son[k]->step);

int i=0;

p=p->son[k];

while(p->parent!=null)

i--;

while(i>=0)

printf("\n");

}int main()

getchar();

}node*v;

v=newnode();

v->step=0;

v->x=v->y=1;

q.push(v);

bfs();

int y;

scanf("%d",&y);

return 0;}

看到大神**後改進的**:

#include #include #include #includeusing namespace std;

#define max(a,b) ((a>b)?(a):(b))

int n,m;

char s[5]=;//每次先遍歷字典序小的節點的子節點

int mov[4][2]=,,,};//陣列儲存x,y變化,可以使用迴圈來加入下乙個節點

int pos[510][510]=;//記錄迷宮地形

int vis[510][510]=;//記錄點是否被訪問過的

char revpro[10000];

struct node

};queueq;

node*newnode()

int check(int tx,int ty)

void bfs()

}if(flag)break;

}printf("%d\n",p->son[i]->step);

int j=0;

p=p->son[i];

while(p->parent!=null)

j--;

while(j>=0)

printf("\n");

}int main()

getchar();

}node*v;

v=newnode();

v->step=0;

v->x=v->y=1;

vis[1][1]=1;

q.push(v);

bfs();

int y;

scanf("%d",&y);

return 0;}

主要改進在於乙個點不用遍歷兩次,大大減低了空間複雜度

演算法提高 學霸的迷宮(藍橋杯)

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

藍橋杯 演算法提高 學霸的迷宮

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

藍橋杯 演算法提高 學霸的迷宮

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