每天一道算法题走迷宫

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一道算法题走迷宫相关的知识,希望对你有一定的参考价值。

输入描述:

输入包含多组数据。

每组数据包含一个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;
}

 

以上是关于每天一道算法题走迷宫的主要内容,如果未能解决你的问题,请参考以下文章

校招准备系列:每天一道算法题

每天一道算法题

使用BFS(广度优先搜索)解迷宫类问题

每天一道算法题之冒泡排序

深度优先算法--判断迷宫的一个起点能否到达一个终点

每天一道面试题:非对称加密之RSA算法