【バックトラッキングアルゴリズム】古典的な迷路問題

トピックの詳細

迷路問題

一連の考え

この問題を解決するためにバックトラッキングという手法を使い、何も考えずに4方向に探索し、歩けるようになったら迷路から抜け出すまで探索を続け、他の方向も探索する。
ここに画像の説明を挿入
フレームワークコード:

バックトラッキング関数のパラメーターが多すぎることによる混乱を避けるために、配列、行、列をグローバル変数として宣言することをお勧めします。

#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