zoukankan      html  css  js  c++  java
  • 【每天一道算法题】走迷宫

    输入描述:

    输入包含多组数据。

    每组数据包含一个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;
    }
  • 相关阅读:
    尴尬的事情又发生Newtonsoft.Json vs Protobuf.net
    python的多线程到底有没有用?
    Python中单线程、多线程和多进程的效率对比实验
    Python 一篇学会多线程
    Python中threading的join和setDaemon的区别及用法
    Python 函数定义以及参数传递
    python的thread和threading区别
    mod_python
    Maven 入门
    微信开发 没有认证过的服务号怎么办?微信提供了測试号(开通了认证过的服务号的功能)
  • 原文地址:https://www.cnblogs.com/LUO77/p/5813864.html
Copyright © 2011-2022 走看看