#include <iostream>
#include <stack>
#include <string.h>
#include <windows.h>
#define M 10
#define N 10
using namespace std;
struct WAY
{
int x,y,direction;
}; //位置坐标及其方向
stack<WAY> way; //定义栈
int a[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//对应上下左右四种操作
int Map[M][N]={{1,1,1,1,1,1,1,1,1,1}, //地图,1代表墙,0代表通道
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
int visit[M][N]; //记录是否已经走过
bool check(const struct WAY &w)
{
return (w.x>0&w.x<9&&w.y>0&&w.y<9);
}
void DrawMap()//画地图
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
if(Map[i][j]==0&&visit[i][j]==1) cout<<"★"; //能够通过的点
else if(Map[i][j]==1) cout<<"■"; //墙
else if(Map[i][j]==0&&visit[i][j]==2) cout<<"×"; //死角
else cout<<"□"; //空白
}
cout<<endl;
}
}
bool dfs()
{
struct WAY start,current;
start.x=1;start.y=1;start.direction=0;//迷宫入口
current=start;
do
{
DrawMap(); //画图
if(!visit[current.x][current.y]&&!Map[current.x][current.y]&&check(current))//判断条件:未走过,不为墙,不越过边界则入栈
{
way.push(current);
visit[current.x][current.y]=1;
if(current.x==8&¤t.y==8) return true; //当到达迷宫终点时返回真
current.x=current.x+a[0][0];current.y=current.y+a[0][1]; //默认先向上探索
}
else
{
if(!way.empty()) //当前位置不能通过时
{
struct WAY temp=way.top(); //保存当前位置
way.pop(); //弹出当前位置
while(temp.direction==3&&!way.empty()) //四个方向均探索后说明该位置无法通过,为死角
{
visit[temp.x][temp.y]=2; //将该点特殊标记,方便区分
temp=way.top(); //再奖栈顶弹出,若也为死角则继续弹出
way.pop();
}
if(temp.direction<3) //向其他方向进行探索
{
temp.direction++;
way.push(temp);
current.x=temp.x+a[temp.direction][0];current.y=temp.y+a[temp.direction][1];
}
}
}
Sleep(500); //延时
system("cls"); //清屏
}while(!way.empty());
return false;
}
int main()
{
memset(visit,0,sizeof(visit));
if(dfs()) cout<<"路线已找到"<<endl;
else cout<<"无法找到路线"<<endl;
return 0;
}
PS:在以上代码中只能找到一条通往出口的路线,且并不为最短路线,故仍需要继续改进,将在以后继续更新,也希望大家能多多指点。