利用深度搜索问题解决游戏中的寻路问题

#include <iostream>
#include <stack>

struct Pos
{
    int _row{};
    int _col{};
    Pos(int row, int col) :_row(row)
        , _col(col) {

    }
    Pos() {

    }
};

std::stack<Pos>s;

bool CheckIsAccess(int* a, int row_size, int col_size, Pos cur)
{
    //行座标不合法 
    if (cur._row <0 || cur._row >= row_size){
        return false;
    }

    //列座标不合法 
    if (cur._col <0 || cur._col>=col_size){
        return false;
    }

    //走过路
    if (a[cur._row * col_size + cur._col] >0){
        return false;
    }


    return true;
}
bool check_pos(int* maze, int rows, int cols, Pos entry)
{
    s.push(entry);
    while (!s.empty()) {
        Pos cur = s.top();
        Pos next = cur;
        //记迷宫的出口仅在下边缘
        if (next._row == rows-1){
            return true;
        }

        //试探上面    
        next._row--;
        if (CheckIsAccess(maze,rows,cols, next)){
            maze[cur._row * cols + cur._col] = 2;
            s.push(next);
            continue;
        }
        //试探下面
        next = cur;
        next._row++;
        if (CheckIsAccess(maze, rows, cols, next)) {
            maze[cur._row * cols + cur._col] = 2;
            s.push(next);
            continue;
        }
        //试探左面
        next = cur;
        next._col--; //列开始减
        if (CheckIsAccess(maze, rows, cols, next)) {
            maze[cur._row * cols + cur._col] = 2;
            s.push(next);
            continue;
        }
        //试探右面
        next = cur;
        next._col++;
        if (CheckIsAccess(maze, rows, cols, next)) {
            maze[cur._row * cols + cur._col] = 2;
            s.push(next);
            continue;
        }

        //回溯,如果其余三个方向均不跳出,则表示无通路
        maze[cur._row * cols + cur._col] = 3;//将走过的点标记为3,也可以不标记

        //如果此节点无路,就删除节点
        s.pop();
    }
    return false;
}

int main()
{
    int map[10][10] = { 1,1,1,1,1,1,1,1,1,1,
                        0,0,1,1,1,1,1,1,1,1,
                        1,0,1,1,1,1,1,1,1,1,
                        1,0,0,1,1,1,1,1,1,1,
                        1,1,0,0,0,0,0,1,1,1,
                        1,1,0,1,1,1,0,1,1,1,
                        1,1,0,1,1,1,0,1,1,1,
                        1,1,0,1,1,1,0,1,1,1,
                        1,1,0,1,1,1,0,0,1,1,
                        1,1,1,1,1,1,1,0,1,1
    };


    bool flag = check_pos((int*)map, 10, 10, Pos(1, 0));
}

 

总结:利用栈的思想,去遍历每个座标,可以走的座标放入栈中,然后每个取遍历,直到此座标不能走位置,若不能走,就把此座标删除掉,然后弹出下一个座标即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章