迷宫问题打印最佳路径
萌新水博客
参考题目 第十届蓝桥杯省赛b组试题E迷宫
思路:
用bfs层层扩展,将到结果扩展的深度记录下来(入口到出口的深度就是12345678…),dfs将扩展的深度当做图去搜索(要走的路径就是当前深度+1),用一个数组或者列表记录所走的路径,搜索完了打印出来即可。
不多废话,上源码
写不下去了,主要就是上面思路
#include <iostream>
#include<bits/stdc++.h>//万能头
using namespace std;
string maze[50];
int ydir[4] = {0, -1, 1, 0};//遍历的方向
int xdir[4] = {1, 0, 0, -1};
int dp[50][50] = {0};
int sum = -1;
int flag = 0;
int ans[200] = {0};//记录路径的数组
struct node
{
int x, y;
node(int _x, int _y)
{
x = _x; y = _y;
}
node(){}
};
queue<node> myq;
bool check(int x, int y)
{ //判断是否可以走
if(x < 0 || y < 0 || x > 29 || y > 49)//临界值
return false;
if(dp[x][y] > 0)//已经走过
return false;
if(maze[x][y] == '1')//有障碍
return false;
return true;
}
void bfs(node a)
{ //经典bfs
myq.push(a);
while(!myq.empty())
{
node t = myq.front();
myq.pop();
if(t.x == 29 && t.y == 49)
{//到达迷宫出口
sum = dp[t.x][t.y];
return;
}
for(int i = 0; i < 4; i++)
{
int xd = t.x + xdir[i];
int yd = t.y + ydir[i];
if(check(xd, yd))
{
//可以走
dp[xd][yd] = dp[t.x][t.y]+1;//深度+1
myq.push(node(xd, yd));
}
}
}
}
void dfs(int x, int y, int k)
{
if(flag)
return;//已经找到了
if(k == sum)
{
string s = "DLRU";
for(int i = 0; i < sum; i++)
{
int idx = ans[i];
cout << s[idx];
}
cout << endl;
flag = 1;
return;
}
for(int i = 0; i < 4; i++)
{
int xd = x + xdir[i];
int yd = y + ydir[i];
if(xd < 0 || xd > 29 || yd < 0 || yd > 49)
continue;
if(dp[xd][yd] == dp[x][y]+1)//找到正确的路线走
{
ans[k] = i;//记录当前所做的路
dfs(xd, yd, k+1);
ans[k] = 0;//回溯,走另外的路记录
}
}
}
int main()
{
freopen("maze.txt","r",stdin);
for(int i = 0; i < 30; i++)
{
cin >> maze[i];
}
dp[0][0] = 1;
bfs(node(0, 0));
dfs(0, 0, 1);
return 0;
}
要注意的地方!!
1.初始位置赋值深度
2.dfs开始的深度和初始位置相同
结语
简单的bfs+dfs 熟练了之后很快就可掌握啦