迷宫

来源:互联网 发布:国外免费代理软件 编辑:程序博客网 时间:2024/05/10 09:28

如何走出这个迷宫?

算法:把迷宫保存在一个二维数组里,0代表不是路,1代表是路,给一个入口,开始探险,对走过的路径做一个标记走过的路:用'2'标记走错的路:用'3'标记

循环实现迷宫

Maze.h

#include<stdio.h>#include<stdlib.h>#include<iostream>#include<stack>using namespace std;#define MAX_ROW 10#define MAX_COL 10struct Position{    Position(int x , int y  );    int _x;    int _y;};class maze{public:    maze(int *array, size_t row, size_t col);//初始化迷宫    void PrintMap();//打印迷宫    void PassMazeNor(Position pos);//非递归实现走迷宫    bool IsPass(Position pos);//判断是否为通路,如果不是通路,返回假,否则返回真    bool IsExit(Position pos);//判断是否为出口,如果不是出口,返回假,否则返回真private:    int _map[MAX_ROW][MAX_COL];};

Maze.cpp

#include"Maze.h"Position::Position(int x , int y  ):_x(x),_y(y){}maze::maze(int *array, size_t row, size_t col)//初始化迷宫{    for (size_t i = 0; i < row; ++i)    {        for (size_t j = 0; j < col; ++j)        {            _map[i][j] = array[i*col + j];        }    }}void maze::PrintMap()//打印迷宫{    printf("迷宫为:\n");    for (size_t i = 0; i <MAX_ROW; ++i)    {        for (size_t j = 0; j < MAX_COL; ++j)        {            cout << _map[i][j] << " ";        }        cout << endl;    }}bool maze::IsPass(Position pos)//判断是否为通路,如果不是通路,返回假,否则返回真{    if (pos._x < 0 || pos._x >= MAX_ROW || pos._y < 0 || pos._y >= MAX_COL)//如果超过数组的边界,那就说明已经到出口        return true;    if (1 == _map[pos._x][pos._y])        return true;    return false;}bool maze::IsExit(Position pos)//判断是否为出口,如果不是出口,返回假,否则返回真{    if (pos._x >= 0 && pos._x < MAX_ROW&&pos._y >= 0 && pos._y < MAX_COL)//此位置还在迷宫里(数组里),那就不是出口,返回假        return false;    return true;//返回真,就意味着此位置是出口}void maze::PassMazeNor(Position pos)//非递归实现走迷宫{    if ( !IsPass(pos) )//判断是否为通路,如果不是通路,直接返回,否则进行下面的步骤        return;    stack<Position> s;        s.push(pos);        while (!s.empty())//栈为空,就退出循环,栈部位空,进入循环        {            if (IsExit(pos))//如果是出口,那就直接返回            {                s.pop();//最后一步不是有效路径,应出栈(栈中保存的是某一步路径)                return;            }            pos = s.top();            _map[pos._x][pos._y] = 2;//把走过的步标记为2            /*先往上走,通的话,一直往上走,上如果不通,那就往左走,还是不通的话,那就往            右走,还是不通的话,往回倒一步(不能往下走,因为走过的路,不能再走),再重新            判断四周,往复循环,直到退到可以改变方向的位置*/            //先往上走                Position up(pos);                up._x -= 1;//x坐标减去1,y坐标不变                if (IsPass(up))//此位置如果是通路,把此位置保存到栈中,并且退出本次循环                {                    s.push(up);                    continue;                }                //往左走                Position left(pos);                    left._y -= 1;//y坐标减去1,x坐标不变                if (IsPass(left))//此位置如果是通路,把此位置保存到栈中,并且退出本次循环                {                    s.push(left);                    continue;                }                //往右走                Position right(pos);                right._y += 1;//y坐标加上1,x坐标不变                if (IsPass(right))//此位置如果是通路,把此位置保存到栈中,并且退出本次循环                {                    s.push(right);                    continue;                }                //往回倒一步(不是往回走,而是往回倒一步,因为走过的路,不能再重复走)                Position down(pos);                down._x += 1;//x坐标加上1,y坐标不变                if (IsPass(down)) //此位置如果是通路,把此位置保存到栈中,并且退出本次循环                {                    s.push(down);                    continue;                }                _map[pos._x][pos._y] = 3;//把往回倒的步标记为3(位置是错的,标记此位置,并回到上一步)                s.pop();//走错的步要出栈,以为栈里保存的是正确的路径        }}

test.cpp

#include"Maze.h"int main(){    int mapArray[MAX_ROW][MAX_COL] =    {        { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },        { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },        { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },        { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 },        { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },        { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },        { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },        { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },    };    maze m((int*)mapArray, MAX_ROW, MAX_COL);    m.PrintMap();    m.PassMazeNor(Position(9, 5));//非递归实现迷宫    m.PrintMap();    system("pause");    return 0;;}

运行结果:
这里写图片描述

递归实现迷宫

Maze.h

#include<stdio.h>#include<stdlib.h>#include<iostream>#include<stack>using namespace std;#define MAX_ROW 10#define MAX_COL 10struct Position{    Position(int x , int y  );    int _x;    int _y;};class maze{public:    maze(int *array, size_t row, size_t col);//初始化迷宫    void PrintMap();//打印迷宫    void PassMazeNor(Position pos);//非递归实现走迷宫    bool IsPass(Position pos);//判断是否为通路,如果不是通路,返回假,否则返回真    bool IsExit(Position pos);//判断是否为出口,如果不是出口,返回假,否则返回真    bool PassMaze(Position pos);//递归实现走迷宫private:    int _map[MAX_ROW][MAX_COL];};

Maze.cpp

#include"Maze.h"Position::Position(int x , int y  ):_x(x),_y(y){}maze::maze(int *array, size_t row, size_t col)//初始化迷宫{    for (size_t i = 0; i < row; ++i)    {        for (size_t j = 0; j < col; ++j)        {            _map[i][j] = array[i*col + j];        }    }}void maze::PrintMap()//打印迷宫{    printf("迷宫为:\n");    for (size_t i = 0; i <MAX_ROW; ++i)    {        for (size_t j = 0; j < MAX_COL; ++j)        {            cout << _map[i][j] << " ";        }        cout << endl;    }}bool maze::IsPass(Position pos)//判断是否为通路,如果不是通路,返回假,否则返回真{    if (pos._x < 0 || pos._x >= MAX_ROW || pos._y < 0 || pos._y >= MAX_COL)//如果超过数组的边界,那就说明已经到出口        return true;    if (1 == _map[pos._x][pos._y])        return true;    return false;}bool maze::IsExit(Position pos)//判断是否为出口,如果不是出口,返回假,否则返回真{    if (pos._x >= 0 && pos._x < MAX_ROW&&pos._y >= 0 && pos._y < MAX_COL)//此位置还在迷宫里(数组里),那就不是出口,返回假        return false;    return true;//返回真,就意味着此位置是出口}/*先往上走,通的话,一直往上走,上如果不通,那就往左走,还是不通的话,那就往右走,还是不通的话,往回倒一步(不能往下走,因为走过的路,不能再走),再重新判断四周,往复循环,直到退到可以改变方向的位置*/bool maze::PassMaze(Position entry)//递归实现走迷宫{    if (IsExit(entry))//如果是出口,那就直接返回        return true;    if (IsPass(entry))    {        _map[entry._x][entry._y] = 2;//把走过的步标记为2        Position up(entry);        up._x -= 1;//x坐标减去1,y坐标不变        if (PassMaze(up))//此位置如果是通路,开始下一次的函数调用            return true;        Position left(entry);        left._y -= 1;//y坐标减去1,x坐标不变        if (PassMaze(left))            return true;        Position right(entry);        right._y += 1;//y坐标加上1,x坐标不变        if (PassMaze(right))            return true;        Position down(entry);        down._x += 1;//x坐标加上1,y坐标不变        if (PassMaze(down))            return true;        _map[entry._x][entry._y] = 3;//把走错的路标记为3    }    return false;}

test.cpp

#include"Maze.h"int main(){    int mapArray[MAX_ROW][MAX_COL] =    {        { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },        { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },        { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },        { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 },        { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },        { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },        { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },        { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },    };    maze m((int*)mapArray, MAX_ROW, MAX_COL);    m.PrintMap();    m.PassMaze(Position(9, 5));//递归实现迷宫    m.PrintMap();    system("pause");    return 0;;}

运行结果:
这里写图片描述

原创粉丝点击