假设有一个迷宫,用Maze(1...M,1...N)表示迷宫,数组元素为1表示死路,为0表示通路,Maze(x1,y1)为迷宫的入口,Maze(x2,y2)为迷宫的出口。试设计一个算法求出一个可能的出口。
深度优先遍历,对每条可能的路径进行一一判断,若为可能的路径则将当前路径节点加入路径栈,若走到死胡同,则回溯至上一个路口在进行判断。
#include<stack>
#include<iostream>
#define ROW 6
#define COL 6
using namespace std;
struct road{
int row;
int col;
};
struct Maze
{
int map[ROW+1][COL+1];
};
void MazeInit(Maze* maze)
{
if(maze==NULL)return;
int temp[ROW+1][COL+1]=
{
{1,1,1,1,1,1,1},
{1,0,1,0,0,0,0},
{1,0,0,0,1,0,0},
{1,0,1,0,0,0,0},
{1,0,1,1,0,1,0},
{1,0,1,0,1,0,0},
{1,0,1,0,1,1,0}
};
for(int row=0;row<=ROW;row++){
for(int col=0;col<=COL;col++){
maze->map[row][col]=temp[row][col];
}
}
}
void Mark(Maze *maze,road cur)
{
maze->map[cur.row][cur.col]=2;
}
bool isvalid(Maze* maze,road cur)
{
if(cur.col>COL||cur.row>ROW)return 0;
if(maze->map[cur.row][cur.col]==0)return 1;
else return 0;
}
bool IsExit(road cur,road exit)
{
if(cur.col==exit.col&&cur.row==exit.row)return 1;
else return 0;
}
void PathStack(Maze* maze,road entry,road exit)
{
stack<road> path;
if(!isvalid(maze,entry))
{cout<<"入口输出错误"<<endl;
return ;
}
if(maze->map[exit.row][exit.col]!=0){
cout<<"出口输出错误"<<endl;
return ;
}
Mark(maze,entry);
path.push(entry);
road cur;
cur=entry;
cout<<"以下为结果"<<endl;
while(1)
{
if(path.empty()){
cout<<"没有找到可用的路径"<<endl;
return ;
}
if(!path.empty())cur=path.top();
cout<<cur.row<<' '<<cur.col<<"->"<<endl;
if(IsExit(cur,exit)){
cout<<"找到了一个出口"<<endl;
return ;
}
road up=cur;
up.row-=1;
if(isvalid(maze,cur)==1){
Mark(maze,up);
path.push(up);
continue;
}
road right=cur;
right.col+=1;
if(isvalid(maze,right)==1){
Mark(maze,right);
path.push(right);
continue;
}
road down=cur;
down.row+=1;
if(isvalid(maze,down)==1){
Mark(maze,down);
path.push(down);
continue;
}
road left=cur;
left.col-=1;
if(isvalid(maze,left)==1){
Mark(maze,left);
path.push(left);
continue;
}
path.pop();
}
}
int main()
{
Maze maze1;
MazeInit(&maze1);
int x1,x2,y1,y2;
cout<<"请输入入口"<<endl;
cin>>x1>>y1;
cout<<"请输入出口"<<endl;
cin>>x2>>y2;
road entry{x1,y1};
road exit{x2,y2};
PathStack(&maze1,entry,exit);
}