【回溯算法】经典迷宫问题

题目详情

迷宫问题

思路

我们采用回溯的方法解决这个问题,无脑四个方向去试探,如果能走就继续试探,直到走出迷宫,如果当前位置已经走到了死胡同,我们就回到刚刚没走到这个位置的位置,向其他方向试探。
在这里插入图片描述
框架代码:

为避免回溯函数参数过多引起混乱,建议将数组,行列声明为全局变量。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int ROW,COL;
vector<vector<int>> maze;
vector<vector<int>> path_tmp;
vector<vector<int>> path_bst;

回溯的核心代码:

void backTrack(int i,int j)
{
    
    
    maze[i][j] = 1;//表示已经走过这里了

    path_tmp.push_back({
    
    i,j});
    
    //判断是否走到最后
    if(i == ROW-1 && j == COL-1)
    {
    
    
        if(path_bst.empty() || path_tmp.size() < path_bst.size())
        {
    
    
            path_bst = path_tmp;
        }
    }

    //右
    if(j+1 < COL && maze[i][j+1] == 0)
        backTrack(i, j+1);
    //上
    if(i-1 >= 0 && maze[i-1][j] == 0)
        backTrack(i-1, j);
    //下
    if(i+1 < ROW && maze[i+1][j] == 0)
        backTrack(i+1, j);
    //左
    if(j-1 >= 0 && maze[i][j-1] == 0)
        backTrack(i, j-1);

    //无路可走就回溯了
    maze[i][j] = 0;
    path_tmp.pop_back();
}

参考代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int ROW,COL;
vector<vector<int>> maze;
vector<vector<int>> path_tmp;
vector<vector<int>> path_bst;


void backTrack(int i,int j)
{
    
    
    maze[i][j] = 1;

    path_tmp.push_back({
    
    i,j});
    
    //判断是否走到最后
    if(i == ROW-1 && j == COL-1)
    {
    
    
        if(path_bst.empty() || path_tmp.size() < path_bst.size())
        {
    
    
            path_bst = path_tmp;
        }
    }

    //右
    if(j+1 < COL && maze[i][j+1] == 0)
        backTrack(i, j+1);
    //上
    if(i-1 >= 0 && maze[i-1][j] == 0)
        backTrack(i-1, j);
    //下
    if(i+1 < ROW && maze[i+1][j] == 0)
        backTrack(i+1, j);
    //左
    if(j-1 >= 0 && maze[i][j-1] == 0)
        backTrack(i, j-1);

    //无路可走就回溯了
    maze[i][j] = 0;
    path_tmp.pop_back();
}
int main() 
{
    
    
    while(cin >> ROW >> COL)
    {
    
    
        //构造迷宫
        maze = vector<vector<int>> (ROW,vector<int> (COL,0));
        for(int i = 0;i<ROW;i++)
            for(int j = 0;j<COL;j++)
            cin >> maze[i][j];

        //从0,0开始寻找

        backTrack(0,0);
        
        for(int i = 0;i<path_bst.size();i++)
        {
    
    
            printf("(%d,%d)\n",path_bst[i][0],path_bst[i][1]);
        }
        path_bst.clear();
        path_tmp.clear();

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_73209194/article/details/130179927