用栈实现的迷宫寻路(C++)

迷宫可视化:

 

寻路规则很简单,如果迷宫的东侧可通(没有障碍且没有来过),就往东走,将走过的路径压入栈中;

如果东侧不可通就顺时针改变行走方向,直到找到下一个可通路径;

如果四个方向都不可通 ,将这个路径弹出栈,回到上一步;

最后找到终点结束循环,或者栈空退出,说明无路可走。

代码如下:

#include <iostream>
#include <stdlib.h>
#include <stack>
using namespace std;
typedef struct{
        int ord;   //序号
        int xpos;
        int ypos;
        //int di;   //24↑ 25↓ 27← 26→
}Selem;
Selem element;
char maze[100][101];

void initElem(int step,int x,int y)
{
    element.ord = step;
    element.xpos = x;
    element.ypos = y;
}

bool Status(char mz[][101],Selem elem)
{
    int x = elem.xpos,y = elem.ypos;
    if(mz[x][y+1] == ' ')
       mz[x][y] = '>';
    else if(mz[x+1][y] == ' ')
        mz[x][y] = '|';
    else if(mz[x][y-1] == ' ')
        mz[x][y] = '<';
    else if(mz[x-1][y] == ' ')
        mz[x][y] = '^';
    else
    {
        mz[x][y] = '$';
        return false;
    }
    return true;
}

int main()
{
    stack<Selem> path;
    int size[2],curpos[2],goal[2],curstep=1;
    cout << "迷宫大小(m,n):" ;
    cin >> size[0] >> size[1];
    cout << "输入迷宫图(#和0组成):" <<endl;
    for(int i=0;i<size[0];i++)
        for(int j=0;j<size[1];j++)
        {
            cin >> maze[i][j];
            if(maze[i][j] == '0')
                maze[i][j] = ' ';
        }
    cout << "输入初始位置:";
    cin >> curpos[0] >> curpos[1];
    initElem(curstep,curpos[0]-1,curpos[1]-1);
    path.push(element);
    cout << "输入终点位置:";
    cin >> goal[0] >> goal[1];
    do
    {
        if(element.xpos == goal[0]-1 && element.ypos == goal[1]-1)
            break;
        if(!Status(maze,path.top()))   //无通路
            path.pop();
        else
        {
            curstep++;
            int x = path.top().xpos,y = path.top().ypos;
            char c = maze[x][y];
            if(c == '>')
                initElem(curstep,x,y+1);
            else if(c == '|')
                initElem(curstep,x+1,y);
            else if(c == '<')
                initElem(curstep,x,y-1);
            else if(c == '^')
                initElem(curstep,x-1,y);
            path.push(element);
        }
    }
    while(path.size() != 0);    //栈空
    maze[goal[0]-1][goal[1]-1] = '@';

    cout << "步数:" << curstep <<endl;
    for(int i=0;i<size[0];i++)
    {
        for(int j=0;j<size[1];j++)
            cout << maze[i][j] << " ";
        cout <<endl;
    }

    return 0;
}

  因为编译器的控制台输出是GBK编码,输出箭头会乱码,所以用其他符号替代。

输入迷宫样例:

# # # # # # # # # #
# 0 0 # 0 0 0 # 0 #
# 0 0 # 0 0 0 # 0 #
# 0 0 0 0 # # 0 0 #
# 0 # # # 0 0 0 # #
# 0 0 0 # 0 0 0 # #
# 0 # 0 0 0 # 0 0 #
# # # # # 0 # # 0 #
# 0 0 0 0 0 0 0 0 #
# # # # # # # # # #

运行结果:

 

 类似暴力破解,不适用于最短路径问题。

 

posted @ 2021-04-03 15:40  梵蒂冈宝石  阅读(466)  评论(0编辑  收藏  举报