图的遍历的定义:
从图的某个顶点出发访问图中所有的点,且每个顶点仅被访问一次。
深度优先搜索DFS:
准备:指定的起始点和终点,确定好当前点与邻接点之间的偏移值、结束搜索的条件、符合访问的点所需条件、回溯处理;
(1)若当前点的邻接点有未被访问的,则选一个进行访问;
(2)若当前点的邻接点都不符合访问条件,退回到当前点的上一个点;
(3)直到访问到目标终点,或是所有点均以访问仍无法到达终点;
前段时间正好帮同学敲一个迷宫的讲解,于是乎。。。
主要代码由C++编写,已附备注
1 #include <stack> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <iostream> 6 7 using namespace std; 8 9 typedef struct { 10 int x, y, step; 11 }point; 12 13 void out(int a[100][100], int m, int n) //用于查看迷宫地图 14 { 15 int i, j; 16 for(i = 0; i < m; i++) 17 { 18 for(j = 0; j < n; j++) 19 cout << a[i][j] << " "; 20 cout << endl; 21 } 22 } 23 24 int main() 25 { 26 int t, z; 27 cout << "请输入需要走几个迷宫:" << endl; 28 while(cin >> t) 29 { 30 int m, n; 31 for(z = 0; z < t; z++) 32 { 33 int i, j; 34 string str; //用于输入 35 stack<point> s; //用于保存已走的路径 36 point start, end; //起始点和终止点 37 int map[100][100]; //迷宫地图 38 int d1[4] = {-1, 0, 1, 0}; //走迷宫的过程中上下方向的偏移值 39 int d2[4] = {0, 1, 0, -1}; //走迷宫的过程中左右方向的偏移值 40 41 cout << "请输入第" << z+1 << "个迷宫的行列:" << endl; 42 cin >> m >> n; 43 44 cout << "请输入第" << z+1 << "个迷宫:" << endl; 45 for(i = 0; i < m; i++)//利用转化的方式,将输入变为数据地图 46 { 47 cin >> str; 48 for(j = 0; j < n; j++) 49 { 50 if(str[j] == 'H') 51 map[i][j] = 1; 52 if(str[j] == 'O') 53 map[i][j] = 0; 54 } 55 } 56 // out(map, m, n); //查看迷宫地图 57 58 cout << "请输入起点坐标和终点坐标:" << endl; 59 cin >> start.x >> start.y >> end.x >> end.y; 60 61 start.step = 1; 62 map[start.x][start.y] = -1; //将起始点在地图上标记出来 63 s.push(start); 64 while(!s.empty()) 65 { 66 point p = s.top(); 67 68 if(p.x == end.x && p.y == end.y) //判断是否到达终点 69 break; 70 71 for(i = 0; i < 4; i++) 72 { 73 int dx = p.x + d1[i]; //下一步的上下位置 74 int dy = p.y + d2[i]; //下一步的左右位置 75 76 if(dx>=0 && dx<m && dy>=0 && dy<n //判断行走就是否符合地图要求 77 && map[dx][dy] == 0) //判断该点是否可走 78 { 79 map[dx][dy] = -1; //走过的点进行标记 80 point px; 81 px.x = dx, px.y = dy, px.step = p.step+1; 82 s.push(px); //将这个符合行走条件的点入栈 83 break; //保证每次只走一步 84 } 85 } 86 if(i == 4) //当i为4的时候,就是四周都不能走,回溯到上一点 87 s.pop(); 88 } 89 if(s.empty()) //因栈为空而停止循环,当然是无法走出迷宫,不通的 90 { 91 cout << "无法走出迷宫!" << endl; 92 continue; 93 } 94 // out(map, m, n); //查看迷宫地图行走情况,走过为-1,墙为1,未走的路为0 95 96 i = 0; 97 point *road = new point[m*n]; //用于输出走出迷宫的路径 98 while(!s.empty()) //读取走过的点 99 { 100 point p = s.top(); 101 road[p.step] = p; 102 s.pop(); 103 i++; 104 } 105 cout << "走出迷宫共用了" << i << "步,经过的点为:"; 106 for(i = 1; i < j; i++) 107 cout << road[i].x << "," << road[i].y << "->"; 108 cout << road[i].x << "," << road[i].y << endl; 109 110 } 111 112 cout << "请输入需要走几个迷宫:" << endl; 113 } 114 return 0; 115 }
广度优先搜索BFS:
等待更新。。。