8 8.@##...##....#.##.#.##....#.###.#.#...#...###.#....#.*...#...###6 5.*.#..#.....##.......#.......@9 6.#..#. .#.*.# .####. ..#... ..#... ..#... ..#... #.@.## .#..#. 0 0样例输出108-1之前写了一个深搜,在做后面的题目时用深搜肯定超时超时超时,索性直接写个广搜,因为我感觉深搜好理解一些,一直遍历一直遍历找到最短的。广搜就直接遍历一次,使得下一次到达的点都是最小的。这样就很好的和队列(先进先出)结合起来。通俗的说就是到达一个点,这个点会同时走4个方向,但是深搜的话走一个方向只有到这条路没法走或者到终点才会返回上一个路口。从起点到终点就是建立队列的过程
1.从起点开始,先将其加入队列,设置步数为0
2.从队列首端取出位置,将从这个位置能够到达的位置加入队列,并且让这些位置的距离为上一个位置的距离加上1
3.循环2直到从队列首端取出的是终点
最简单的理解方法就是画图,结合队列的先进先出,每到达一个点
#include<iostream>#include<queue>using namespace std;typedef pair<int, int> P;int n, m, q1, q2, z1, z2;char a[21][21];int pd(int i, int j){ if (i < 0 || j < 0 || i >= n || j >= m || a[i][j] == '#')//不能出边界 return 0; return 1;}int main(){ while (1){ int map[21][21]; cin >> n >> m; if (n == 0 && m == 0) break; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ cin >> a[i][j]; map[i][j] = 1000; if (a[i][j] == '@'){ q1 = i; q2 = j; } if (a[i][j] == '*'){ z1 = i; z2 = j; } } } queue<P> que; map[q1][q2] = 0; que.push(P(q1, q2));//将起点入队列 while (que.size()) { P p = que.front(); //取得头元素 que.pop(); if (p.first == z1&&p.second == z2) break; if (pd(p.first + 1, p.second) && map[p.first + 1][p.second] == 1000){//如果地图上某一点已经走过了,那就不用走了,肯定有别的方法到达它更短 map[p.first + 1][p.second] = map[p.first][p.second] + 1;//因为在每次处理的位置都是递增的。走过的路不用走了,也映证了广搜 que.push(P(p.first + 1, p.second)); } if (pd(p.first - 1, p.second) && map[p.first - 1][p.second] == 1000){ map[p.first - 1][p.second] = map[p.first][p.second] + 1; que.push(P(p.first - 1, p.second)); } if (pd(p.first, p.second + 1) && map[p.first][p.second + 1] == 1000){ map[p.first][p.second + 1] = map[p.first][p.second] + 1; que.push(P(p.first, p.second + 1)); } if (pd(p.first, p.second - 1) && map[p.first][p.second - 1] == 1000){ map[p.first][p.second - 1] = map[p.first][p.second] + 1; que.push(P(p.first, p.second - 1)); } } if (map[z1][z2] == 1000) PRintf("-1/n"); else printf("%d/n", map[z1][z2]); } return 0;}先结合图理解代码。有好的思想一起交流实在不懂了就可以先看下:抓住那头牛。这道题的广搜就简单很多http://blog.csdn.net/QQ_33193309/article/details/55260780
新闻热点
疑难解答