输入描述:
输入包含多组数据。
每组数据包含一个10*10,由“#”和“.”组成的迷宫。其中“#”代表墙;“.”代表通路。
入口在第一行第二列;出口在最后一行第九列。
从任意一个“.”点都能一步走到上下左右四个方向的“.”点。
输出描述:
对应每组数据,输出从入口到出口最短需要几步。
输入例子:
#.########
#........#
#........#
#........#
#........#
#........#
#........#
#........#
#........#
########.#
#.########
#........#
########.#
#........#
#.########
#........#
########.#
#........#
#.######.#
########.#
走迷宫,不应该说是一道题,应该说是一类题。之前华为OJ上也有。不过它只要求计算能不能走出迷宫,并没有要求最少步数。
其实就是构建一棵树。出口节点所在的层数就是其最少的步数,而start节点就是根节点。在这棵树上执行BFS算法。
自定义一个struct存储坐标位置,及该节点,所在层数。
BFS:
1、根节点入队列(这里是start入队)
2、读取其周围位置,类似其孩子节点。
3、判断是否到达出口节点,走到其孩子节点,将其标志为visited。
如果最后没有到达出口节点且队列已空,说明无法找到路径至出口,返回0。
#include <vector> #include <iostream> #include <queue> using namespace std; struct pos { int x; int y; int level; }; int BFS(vector<vector<char>>& map) { const int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; queue<pos> q; int m = map.size(); int n = map[0].size(); vector<vector<bool>> visited(m, vector<bool>(n, false)); pos start = { 0,1,0 }, end = { 9,8,0 }; q.push(start); visited[start.x][start.y] = true; while (!q.empty()) { pos tmp = q.front(), nextpos; q.pop(); for (int i = 0; i < 4; i++) { nextpos.x = tmp.x + dir[i][0]; nextpos.y = tmp.y + dir[i][1]; nextpos.level = tmp.level + 1; if (nextpos.x == end.x&&nextpos.y == end.y) return nextpos.level; if (nextpos.x >= 0 && nextpos.x < m&&nextpos.y >= 0 && nextpos.y < n&&visited[nextpos.x][nextpos.y] == false&&map[nextpos.x][nextpos.y]=='.') { q.push(nextpos); visited[nextpos.x][nextpos.y] = true; } } } return 0; } int main() { vector<vector<char>> map(10, vector<char>(10)); while (cin >> map[0][0]) { for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) { if (i == 0 && j == 0) continue; cin >> map[i][j]; } cout << BFS(map) << endl; } return 0; }