題目鏈結
題目很好理解大家自己去看一下就好,大致思路就是bfs求出路徑並且利用陣列記錄一下路徑,b[nx][ny]=b[x][y]+1代表(x,y)是(nx,ny)的字首,這個技巧很好用,從乙個大佬那裡學來的(heihei),然後我們需要從終點開始作為bfs的起點,並且記錄路徑,這樣做的目的就是保證了我們記錄的路徑一定是可以到達終點的路徑,然後我們利用dfs從(1,1)開始尋找字典序最小的路徑,一次按順序判斷每個點四個方向的下乙個點與前乙個點的b陣列的差值是否為1,滿足就直接輸出該方向,最後在輸出的時候針對一些特殊情況進行判斷,終點為1或者到不了終點這兩種情況我們直接輸出-1。
ac**:
#include
#define ll long long
#define pb push_back
#define pop pop_back()
#define pii pair
#define fi first
#define se second
#define ull unsigned long long
#define endl '\n'
using
namespace std;
const
int inf=
0x3f3f3f3f
;const
double pi=
acos(-
1),eps=
1e-8
;const
int maxn=
1<<17;
const
int n=
1e3+
10,m=
2e7+
10,mod=
998244353
;int n,m;
int a[n]
[n];
int b[n]
[n];
int dx[4]
=;int dy[4]
=;void
bfs()}
}}void
dfs(
int x,
int y)
xx=x,yy=y-1;
if(yy>=
1&&b[xx]
[yy]
==b[x]
[y]-1)
xx=x,yy=y+1;
if(yy<=m&&b[xx]
[yy]
==b[x]
[y]-1)
xx=x-
1,yy=y;
if(xx>=
1&&b[xx]
[yy]
==b[x]
[y]-1)
}int
main()
}if(a[n]
[m]==1)
bfs();
if(b[1]
[1]==
-1) cout << b[1]
[1]<< endl;
dfs(1,
1);return0;
}
BFS求最短路
假設有乙個n行m列的迷宮,每個單位要麼是空地 用1表示 要麼是障礙物 用0表示 如和找到從起點到終點的最短路徑?利用bfs搜尋,逐步計算出每個節點到起點的最短距離,以及最短路徑每個節點的前乙個節點。最終將生成一顆以起點為根的bfs樹。此時bfs可以求出任意一點到起點的距離。poj3984 bfs求最...
BFS求最短路
假設有乙個n行m列的迷宮,每個單位格要麼是空地 用1來表示 要麼是障礙物 用0來表示 如何找到從起點到終點的最短路徑?分析 要找到終點到起點的最短路徑,可以使用二叉樹的bfs,因為二叉樹的bfs的訪問順序就是結點到根節點的距離,從小到大訪問的,因此可以從迷宮圖的起點開始進行bfs的寬度優先遍歷。遍歷...
BFS和順序佇列求最短路徑
資料結構的課程開始也有一段時間了,第一次實驗作業中,有這樣一道題 大意是說給定兩個數軸上的點m,n.限定m的移動方式有3種 左移一步 即mnew m 1 右移一步 即mnew m 1 右跳一步 即mnew m 2 問m最少移動幾次可以到達n 初次看題我沒想到用哪種資料結構,自己學得慢 與老師無瓜.因...