最终——迷宫求解

来源:互联网 发布:淘宝有一家恐怖古着店 编辑:程序博客网 时间:2024/05/18 00:47

最终的迷宫求解代码,还有一些不规范的地方。

解决了上一次的不能倒退和找出路径的问题……

这次改动比较大,为了调试方便注释了数据输入,直接定义了个6*6的矩阵。

话不多说,上代码吧

先是.h文件:

#include <iostream>#include <stack>using namespace std;class Maze{private:static const int n=6;//矩阵的大小stack<int> back_r;//用来记录前进的方向变化//int start_x,start_y,end_x,end_y;public:explicit Maze();//显示声明,禁止系统隐式转换//void Maze_DataInput();//数据输入void Maze_DataShow() const;int NoPass(int ,int );//判断是否可以通过void FootStep(int ,int ,int );////留下足迹,清除足迹int MazePath();//迷宫求解int JudgeOver(int ,int );//判断对数组的访问是否越界int NextStep(int& ,int& ,int );//寻找下一步void Back(int &,int &,int );//退回一步static int mat[6][6];//n*n的矩阵};

然后是.cpp文件:

#include "Maze.h"int Maze::mat[6][6]={0,0,0,0,0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,0,1,2};Maze::Maze(){}/*void Maze::Maze_DataInput(){//默认不过走的值为1,可走的值为0,终点为2int i=0,j=0;for(;i<n;++i)for(j=0;j<n;++j){mat[i][j]=1;}cout<<"请输入矩阵中可行的位置,从0,0开始:(格式为:行数 列数)\n"<<"结束输入请输入(-1 -1)"<<endl;while(1){cin>>i>>j;if(-1!=i && -1!=j)mat[i][j]=0;else break;}cout<<"请输入起点位置:"<<endl;cin>>start_x>>start_y;cout<<"请输入终点的位置"<<endl;cin>>end_x>>end_y;mat[end_x][end_y]=2;}*/void Maze::Maze_DataShow() const{//打印输出for(int x=0;x<n;++x)for(int y=0;y<n;++y){cout<<mat[x][y]<<' ';if(y+1==n) cout<<endl;}}int Maze::JudgeOver(int x,int y){//判断对数组的访问是否越界//不越界返回0if(x<0 || y<0)return 1;if(x>n-1 || y>n-1)return 1;return 0;}void Maze::FootStep(int x,int y,int k){//k=1标记此路不通//k=0是标记通路,最后输出一条8的出迷宫路径if(0==k)mat[x][y]=8;else mat[x][y]=1;}int Maze::NoPass(int x,int y){//返回0表示可以通过if(!JudgeOver(x,y))if(0==mat[x][y])return 0;return 1;}int Maze::NextStep(int &x,int &y,int k){//判断下一步的方向,返回值方向按东-1,南-2,西-3,北-4动态变化,0表示无变化if(back_r.top()-k==2 || back_r.top()-k==-2)//禁止向来的路走return 0;switch(k){case 1:if(!JudgeOver(x,y+1) && mat[x][y+1]!=1){y++;return 1;}break;case 2:if(!JudgeOver(x+1,y) && mat[x+1][y]!=1){x++;return 2;}break;case 3:if(!JudgeOver(x,y-1) && mat[x][y-1]!=1){y--;return 3;}break;case 4:if(!JudgeOver(x-1,y) && mat[x-1][y]!=1){x--;return 4;}break;}return 0;}int Maze::MazePath(){//返回值0表示成功找到出口,1表示失败int sx=0,sy=0;int k=1,kt=1;//表示下一步的方向int sn=0;//NextStep(sx,sy,k)的中间变量,调试便于观察//sx,sy分别表示开始的(x,y)坐标cout<<"输入起始位置"<<endl;cin>>sx>>sy;back_r.push(9);//打入一个数,可用作判断栈底do {if(k>4) k=1;//重置方向if(2==mat[sx][sy])return 0;if(!NoPass(sx,sy)){FootStep(sx,sy,0);//进入下一步的方向判断,变化的方向入back_r栈sn=NextStep(sx,sy,k);back_r.push(sn);}//如果不能通过且栈非空,则令栈顶元素0出栈else{if(!back_r.empty()){kt=k;if(0==back_r.top())back_r.pop();while(NoPass(sx,sy)){k=0;while(k!=5)//每个方向去试,不包括来时的路{k++;sn=NextStep(sx,sy,k);if(!sn)continue;else {back_r.push(sn);break;}}if(k!=5)break;else k=kt;int t=back_r.top();Back(sx,sy,t);//退后一步back_r.pop();}}}}while(!back_r.empty());return 1;}void Maze::Back(int &x,int &y,int i){FootStep(x,y,1);//退回一步,(x,y),i用来判断往哪个方向退回switch(i){case 1:{y--;}break;case 2:{x--;}break;case 3:{y++;}break;case 4:{x++;}break;}}

最后是main()函数:

#include "Maze.h"void main(){Maze mt;//mt.Maze_DataInput();mt.Maze_DataShow();if(!mt.MazePath()){cout<<"OK!"<<endl;mt.Maze_DataShow();//打印出迷宫的路径,一条数字8的通路return ;}mt.Maze_DataShow();cout<<"False!"<<endl;}

写得不好,望大家多多指教!


原创粉丝点击