昨天看了一下广度意义上的深度遍历(dfs) 今天接着学到了广度意义上的广度优先遍历(bfs)
这种广度优先遍历在实际意义上与图中深度遍历优先是类似的
dfs隐含的利用了栈(递归),bfs则是利用了队列
这道题便是利用bfs的一道题 每次从栈中弹出元素 都会把它上下左右四个方向检测将未访问可达的元素入栈
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 #define INF 1000000 5 #define Max_n 100 6 #define Max_m 100 7 typedef pair<int, int> P; 8 char maze[Max_n][Max_m]; 9 int N, M; 10 int sx, sy; 11 int ex, ey; 12 int Dist[Max_n][Max_n]; 13 int dx[4] = { -1,0,1,0 }; 14 int dy[4] = { 0,1,0,-1 }; 15 int bfs(){ 16 for (int i = 0; i < N; i++) 17 for (int j = 0; j < M; j++) 18 Dist[i][j] = INF; 19 queue<P> S; 20 Dist[sx][sy] = 0; //将始点距离置为0 21 S.push(P(sx, sy));//将始点入栈 22 while (S.size()){ 23 P p = S.front(); S.pop(); 24 if (p.first == ex && p.second == ey)break;//检测是否到达终点 25 else{ 26 for (int i = 0; i < 4; i++){ 27 //得到新的位置 28 int nx = p.first + dx[i]; 29 int ny = p.second + dy[i]; 30 //检测位置是否合法 且可通和未访问 31 if (nx >= 0 && nx < N && ny >= 0 && ny < M && maze[nx][ny] != '#' && Dist[nx][ny] == INF){ 32 Dist[nx][ny] = Dist[p.first][p.second] + 1; 33 S.push(P(nx, ny)); 34 } 35 } 36 } 37 } 38 return Dist[ex][ey]; 39 } 40 void solve(){ 41 int min = bfs(); 42 cout << min; 43 } 44 //读入数据 45 int main() 46 { 47 cin >> N >> M; 48 for (int i = 0; i < N; i++) 49 for (int j = 0; j < M; j++) 50 cin >> maze[i][j]; 51 cin >> sx >> sy >> ex >> ey; 52 solve(); 53 return 0; 54 } 55 56 /* 57 10 10 58 #S######.# 59 ......#..# 60 .#.##.##.# 61 .#........ 62 ##.##.#### 63 ....#....# 64 .#######.# 65 ....#..... 66 .####.###. 67 ....#...G# 68 0 1 69 9 8 70 */
dfs和bfs都是属于枚举的方法
接着书上提到了贪心
贪心是遵循某种规则 不断贪心地选取当前最优策略地想法
书上给了几道很好地例题来体现 硬币问题 区间问题 字典序最小问题
再接着讲到了动态规划(dynamic programming)
提到了背包问题 利用记忆化搜索 将已经处理过的情况记录