迷宫问题打印最佳路径

迷宫问题打印最佳路径

萌新水博客

参考题目 第十届蓝桥杯省赛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 熟练了之后很快就可掌握啦

猜你喜欢

转载自blog.csdn.net/glum_0111/article/details/105121620