迷宫问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迷宫问题相关的知识,希望对你有一定的参考价值。

1、问题描述:就是在一个迷宫中,找出能够一条路线,从起点到终点的一条路线,走出迷宫,走过的路线均被标记出来。

  分析:这个的用到栈来保存路径,并且对每种情况都得考虑清楚。

2、代码实现:

因为要用到栈,所以用C++写比较方便;

#include<iostream>
#include<stack>
#include<time.h>
#include<ctype.h>
using namespace std;
//迷宫 :Maze
#define ROW_COUNT    8
#define COL_COUNT    8

#define WALL        1
#define NOT_WALL    0

#define WALL_COUNT    24

typedef struct POS{
    int x;  //行
    int y;  //列
}POS;

typedef enum{RIGHT, DOWN, LEFT, UP}DIR; //枚举类型,0,1,2,3,我自定义位置:右、下、左、上

typedef struct MAN{  //定义一个人的类型
    POS pos;  //位置
    DIR di;   //方向
}MAN;

void initMaze(int (*Maze)[COL_COUNT], int count);//初始化迷宫
void showMaze(int (*Maze)[COL_COUNT], int row, int col);//显示迷宫
bool pass(int (*Maze)[COL_COUNT], POS curpos);//判断当前点是否能通过
void footMaze(int (*Maze)[COL_COUNT], POS pos);//走过的线路做好标记
POS nextPos(POS pos, DIR di); //获得下一个位置
void markPrint(int (*Maze)[COL_COUNT], POS pos);//回退的路线做的标记
bool MazePath(int (*Maze)[COL_COUNT], POS start, POS end);//处理迷宫路径的函数

bool MazePath(int (*Maze)[COL_COUNT], POS start, POS end){
    MAN man;
    stack<MAN> st;
    POS curpos = start;

    do{
        if(pass(Maze, curpos)){ //能否通过
            man.pos = curpos;
            man.di = RIGHT;
            footMaze(Maze, man.pos);
            if(curpos.x == end.x && curpos.y == end.y)//判断是否走到终点了
                return true;
            st.push(man);
            curpos = nextPos(man.pos, man.di);
        }else{
            if(!st.empty()){
                man = st.top();
                while(man.di==UP && !st.empty()){ //判断4个方向还有的走吗?
                    markPrint(Maze, man.pos);  //就是四个方向都不能走了,回退时标记为4;
                    st.pop();
                    man = st.top();
                }

                if(man.di < UP){
                    st.pop();
                    man.di =(DIR)(man.di+1); //下一个方向
                    st.push(man);
                    curpos = nextPos(man.pos, man.di);
                }
            }
        }
    }while(!st.empty());

    return true;
}

void markPrint(int (*Maze)[COL_COUNT], POS pos){
    Maze[pos.x][pos.y] = 4;
}

POS nextPos(POS pos, DIR di){
    switch(di){
    case RIGHT:
        pos.y += 1;
        break;
    case DOWN:
        pos.x += 1;
        break;
    case LEFT:
        pos.y -= 1;
        break;
    case UP:
        pos.x -= 1;
        break;
    }
    return pos;
}

void footMaze(int (*Maze)[COL_COUNT], POS pos){
    Maze[pos.x][pos.y] = 2;
}

bool pass(int (*Maze)[COL_COUNT], POS curpos){
    if(Maze[curpos.x][curpos.y] == NOT_WALL)
        return true;
    return false;
}

void showMaze(int (*Maze)[COL_COUNT], int row, int col){
    int i;
    int j;

    for(i = 0; i < row; i++){
        for(j = 0; j < col; j++){
            cout<<Maze[i][j]<<" ";
        }
        cout<<endl;
    }
}

void initMaze(int (*Maze)[COL_COUNT], int count){
    int i;
    int index;
    
    srand(time(NULL));
    for(i = 0; i < WALL_COUNT; i++){
        index = rand()%count;
        if(Maze[0][index] != WALL){
            Maze[0][index] = WALL;
        }
        
    }
}

int main(void){
    int Maze[ROW_COUNT][COL_COUNT] = {0};
    POS start = {1, 0};
    POS end = {7, 7};

    initMaze(Maze, ROW_COUNT*COL_COUNT);
    if(Maze[1][0] == WALL || Maze[7][7] == WALL){
        cout<<"起始、终止位置有一个为墙,游戏结束"<<endl;
        return 0;
    }
    showMaze(Maze, ROW_COUNT, COL_COUNT);

    MazePath(Maze, start, end);
    cout<<"------------------------------------"<<endl;
    showMaze(Maze, ROW_COUNT, COL_COUNT);
    return 0;
}

运行结果

技术分享

2:代表走的路线,从<1, 0>----><7, 7>

4:代表回退的路线。


本文出自 “11586096” 博客,请务必保留此出处http://11596096.blog.51cto.com/11586096/1858999

以上是关于迷宫问题的主要内容,如果未能解决你的问题,请参考以下文章

迷宫问题

迷宫问题代码

关于回溯java的迷宫解析问题

跪求高手 数据结构迷宫问题

数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)

超详解的迷宫问题(Java版)