一、思路
指定的起始点和终点,确定好当前点与邻接点之间的偏移值、结束搜索的条件、符合访问的点所需条件、回溯处理
1、若当前点的邻接点有未被访问的,则选一个进行访问;
2、若当前点的邻接点都不符合访问条件,退回到当前点的上一个点;
3、直到访问到目标终点,或是所有点均以访问仍无法到达终点;
二、伪代码
DFS可以通过递归函数、栈(先入后出的存储结构)来实现
1、递归方法实现思路
2、栈实现思路
三、实例
前段时间正好帮同学敲一个迷宫的讲解,针对具体题目H是墙,O是路。。。
代码由C++编写
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 typedef struct { 9 int x, y, step;10 }point;11 void out(int a[100][100], int m, int n){ //用于查看迷宫地图12 int i, j;13 for(i = 0; i < m; i++){14 for(j = 0; j < n; j++)15 cout << a[i][j] << " ";16 cout << endl;17 }18 }19 20 int main(){21 int t, z;22 cout << "请输入需要走几个迷宫:" << endl;23 while(cin >> t){24 int m, n;25 for(z = 0; z < t; z++){26 int i, j;27 string str; //用于输入28 stack s; //用于保存已走的路径29 point start, end; //起始点和终止点30 int map[100][100]; //迷宫地图31 int d1[4] = {-1, 0, 1, 0}; //走迷宫的过程中上下方向的偏移值32 int d2[4] = { 0, 1, 0, -1}; //走迷宫的过程中左右方向的偏移值33 34 cout << "请输入第" << z+1 << "个迷宫的行列:" << endl;35 cin >> m >> n;36 37 cout << "请输入第" << z+1 << "个迷宫:" << endl;38 for(i = 0; i < m; i++){ //利用转化的方式,将输入变为数据地图39 cin >> str;40 for(j = 0; j < n; j++){41 if(str[j] == 'H')42 map[i][j] = 1;43 if(str[j] == 'O')44 map[i][j] = 0;45 }46 }//out(map, m, n); //查看迷宫地图47 48 cout << "请输入起点坐标和终点坐标:" << endl;49 cin >> start.x >> start.y >> end.x >> end.y;50 51 start.step = 1;52 map[start.x][start.y] = -1; //将起始点在地图上标记出来53 s.push(start);54 while(!s.empty()){55 point p = s.top();56 57 if(p.x == end.x && p.y == end.y) //判断是否到达终点58 break;59 60 for(i = 0; i < 4; i++){61 int dx = p.x + d1[i]; //下一步的上下位置62 int dy = p.y + d2[i]; //下一步的左右位置63 //判断邻接点是否符合走的要求64 if(dx>=0 && dx =0 && dy ";92 cout << road[i].x << "," << road[i].y << endl;93 }94 cout << "请输入需要走几个迷宫:" << endl;95 }96 return 0;97 }
等待更新。。。