深搜dfs
都用到了上一篇的mystack栈
1. 不打印路径的版本
#include
#include
#include "mystack"
#define MAXROW 10
#define MAXLINE 10
using namespace std;
typedef struct _Point
{
int _x;
int _y;
}Point;
int maze[MAXROW][MAXLINE] = {
1,1,1,1,1,1,1,1,1,1,
0,0,0,1,1,1,1,1,1,1,
1,1,0,1,1,1,1,1,1,1,
1,1,0,0,0,0,1,1,1,1,
1,1,0,1,1,0,1,1,1,1,
1,1,0,1,1,0,1,1,1,1,
1,1,1,1,1,0,1,1,1,1,
1,1,1,1,1,0,0,0,1,1,
1,1,1,1,1,1,1,0,0,0,
1,1,1,1,1,1,1,1,1,1,
};
Stack s;
Point sp = {1, 0}, ep = {8, 9};
void displyMaze(){
for(int i=0; i< MAXROW; i++){
for(int j=0; j= 0 && maze[t._x-1][t._y]==0) // 上
{
visit(t._x-1, t._y);
}
if (t._x+1 <= 9 && maze[t._x+1][t._y]==0) // 下
{
visit(t._x+1, t._y);
}
if (t._y-1 >= 0 && maze[t._x][t._y-1]==0) // 左
{
visit(t._x, t._y-1);
}
if (t._y+1 <= 9 && maze[t._x][t._y+1]==0) // 右
{
visit(t._x, t._y+1);
}
if (t._x == ep._x && t._y == ep._y)
{
flag = 1;
clear(&s);
break;
}
}
if (flag==1)
{
cout << "find path" << endl;
}else{
cout << "NOT found" << endl;
}
return 0;
}
2. 打印路径的版本
另外维护一个二维数组,上面每个点记录走到这个点的前一步,最后倒推就可得到正确路径
通过栈的方式可以把倒序的路径正序输出
#include
#include
#include
#include "mystack"
#define MAXROW 10
#define MAXLINE 10
using namespace std;
// 栈的链式存储
typedef struct _Point
{
int _x;
int _y;
}Point;
Point prePts[MAXROW][MAXLINE];
int maze[MAXROW][MAXLINE] = {
1,1,1,1,1,1,1,1,1,1,
0,0,0,1,1,1,1,1,1,1,
1,1,0,1,1,1,1,1,1,1,
1,1,0,0,0,0,1,1,1,1,
1,1,0,1,1,0,1,1,1,1,
1,1,0,1,1,0,1,1,1,1,
1,1,1,1,1,0,1,1,1,1,
1,1,1,1,1,0,0,0,1,1,
1,1,1,1,1,1,1,0,0,0,
1,1,1,1,1,1,1,1,1,1,
};
Stack s;
Point sp = {1, 0}, ep = {8, 9};
void displyMaze(){
for(int i=0; i< MAXROW; i++){
for(int j=0; j= 0 && maze[t._x][t._y-1]==0) // 左
{
visit(t._x, t._y-1, t);
}
if (t._y+1 <= 9 && maze[t._x][t._y+1]==0) // 右
{
visit(t._x, t._y+1, t);
}
if (t._x-1 >= 0 && maze[t._x-1][t._y]==0) // 上
{
visit(t._x-1, t._y, t);
}
if (t._x+1 <= 9 && maze[t._x+1][t._y]==0) // 下
{
visit(t._x+1, t._y, t);
}
if (t._x == ep._x && t._y == ep._y)
{
flag = 1;
clear(&s);
break;
}
}
#endif
if (flag==1)
{
cout << "find path" << endl;
}else{
cout << "NOT find" << endl;
}
displyPath();
return 0;
}