(C++) BFS求解最短路长度及最短路路径
一、问题描述:(迷宫问题)
在一张由0, 1构成的图中,1表示障碍,0表示通路
给定起点S和终点T
求从S到T的最短路长度并输出路径
二、求解思路:(BFS)
首先BFS是由队列实现和队列先进先出的特性,
对于求最短路长度,我们可以从终点T开始倒着搜索,
用一个数组dist[][]表示每个点到终点T的最短路径,
如果一个点能由上一个点一步走到,则将该点入队,直到队列为空即遍历完所有的点。
对于求路径,可以在dist数组的基础上,从起点开始搜索,
如果有一点能由当前点一步走到,则该点一定在最短路径上。
三、代码实现:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std
;
const int maxn
= 1010;
char mp
[maxn
][maxn
];
int dist
[maxn
][maxn
];
int n
;
int sx
, sy
, tx
, ty
;
int dx
[4] = {1, 0, 0, -1}, dy
[4] = {0, -1, 1, 0};
char dir
[4] = {'D', 'L', 'R', 'U'};
void bfs()
{
for(int i
= 0; i
< n
; i
++)
for(int j
= 0; j
< n
; j
++)
dist
[i
][j
] = 1e9;
dist
[tx
][ty
] = 0;
queue
<pair
<int, int> > q
;
pair
<int, int> t
;
t
.first
= tx
;
t
.second
= ty
;
q
.push(t
);
while(q
.size()){
t
= q
.front();
q
.pop();
for(int i
= 0; i
< 4; i
++){
int nx
= t
.first
+ dx
[i
];
int ny
= t
.second
+ dy
[i
];
if(nx
>= 0 && nx
< n
&& ny
>= 0 && ny
< n
&& dist
[nx
][ny
] == 1e9 && mp
[nx
][ny
] != '1'){
dist
[nx
][ny
] = dist
[t
.first
][t
.second
] + 1;
q
.push(make_pair(nx
, ny
));
}
}
}
}
int main()
{
cin
>> n
;
for(int i
= 0; i
< n
; i
++){
for(int j
= 0; j
< n
; j
++){
cin
>> mp
[i
][j
];
if(mp
[i
][j
] == 'S'){
sx
= i
;
sy
= j
;
}
if(mp
[i
][j
] == 'T'){
tx
= i
;
ty
= j
;
}
}
}
bfs();
cout
<< dist
[sx
][sy
] << endl
;
int x
= sx
, y
= sy
;
while(x
!= tx
|| y
!= ty
){
for(int i
= 0; i
< 4; i
++){
int nx
= x
+ dx
[i
];
int ny
= y
+ dy
[i
];
if(nx
>= 0 && nx
< n
&& ny
>= 0 && ny
< n
&& mp
[nx
][ny
] != '1'){
if(dist
[x
][y
] == dist
[nx
][ny
] + 1){
cout
<< dir
[i
] << endl
;
x
= nx
;
y
= ny
;
break;
}
}
}
}
return 0;
}
四、运行结果:
随便测了一个数据,大家可以去各个OJ找相关题目,按照思想去试一下
五、变形
可以修改的地方有很多,这里主要说一种修改的输出方式
只需要修改main函数中遍历输出的部分即可
代码如下
int x
= sx
, y
= sy
cout
<< "(" << x
<< ", " << y
<< ")" << endl
;
while(x
!= tx
|| y
!= ty
){
for(int i
= 0; i
< 4; i
++){
int nx
= x
+ dx
[i
];
int ny
= y
+ dy
[i
];
if(nx
>= 0 && nx
< n
&& ny
>= 0 && ny
< n
&& mp
[nx
][ny
] != '1'){
if(dist
[x
][y
] == dist
[nx
][ny
] + 1){
cout
<< "(" << nx
<< ", " << ny
<< ")" << endl
;
x
= nx
;
y
= ny
;
break;
}
}
}
}
结果如下