【编程马拉松】【015-走迷宫】
来源:互联网 发布:mil域名 编辑:程序博客网 时间:2024/05/16 01:55
【编程马拉松算法目录】
【015-走迷宫】【工程下载>>>】
1 题目描述
NowCoder最喜欢游乐场的迷宫游戏,他和小伙伴们比赛谁先走出迷宫。
现在把迷宫的地图给你,你能帮他算出最快走出迷宫需要多少步吗?
1.1 输入描述:
输入包含多组数据。
每组数据包含一个10*10,由“#”和“.”组成的迷宫。其中“#”代表墙;“.”代表通路。
入口在第一行第二列;出口在最后一行第九列。
从任意一个“.”点都能一步走到上下左右四个方向的“.”点。
1.2 输出描述:
对应每组数据,输出从入口到出口最短需要几步。
1.3 输入例子:
#.#########........##........##........##........##........##........##........##........#########.##.#########........#########.##........##.#########........#########.##........##.######.#########.#
1.4 输出例子:
1630
2 解题思路
因为题意是使用最少的步数走出迷宫,所要可以使用广度优先遍历的方式,每处理完一层说明走了一步,最先到达出口使用的步数最少。根据输入的例子,迷宫的走法如图1所示。
图1 迷宫找最短路径
3 算法实现
import java.util.ArrayDeque;import java.util.Queue;import java.util.Scanner;/** * Author: 王俊超 * Time: 2016-05-11 18:59 * CSDN: http://blog.csdn.net/derrantcm * Github: https://github.com/Wang-Jun-Chao * Declaration: All Rights Reserved !!! */public class Main { private final static int N = 10; public static void main(String[] args) { Scanner scanner = new Scanner(System.in);// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNextLine()) { char[][] maze = new char[N][N]; for (int i = 0; i < N; i++) { maze[i] = scanner.nextLine().toCharArray(); } System.out.println(minStep(maze)); } scanner.close(); } /** * 求使用最少的步骤走出迷宫,迷宫大小固定为10*10,起点为(0, 1),终点为(9, 8) * * @param maze 迷宫 * @return 走出迷宫最少的步数,走不出去返回-1 */ private static int minStep(char[][] maze) { // 记录当前处理层的位置 Queue<Integer> curr = new ArrayDeque<>(N * N); // 记录下一层处理的位置 Queue<Integer> next = new ArrayDeque<>(N * N); // 可以移动的四个方向,两个一组 int[] d = {1, 0, 0, 1, -1, 0, 0, -1}; // 添加起点; curr.add(0); curr.add(1); int x; int y; // 记录最少的步数 int step = 0; while (!curr.isEmpty()) { x = curr.remove(); y = curr.remove(); // 找到终点位置 if (x == 9 && y == 8) { return step; } // 处理(x, y)位置的四个方向 for (int i = 0; i < d.length; i += 2) { int t = x + d[i]; int v = y + d[i + 1]; if (t >= 0 && t < N && v >= 0 && v < N && maze[t][v] == '.') { // 标记已经访问过 maze[t][v] = '#'; // 访问的位置添加到队列中 next.add(t); next.add(v); } } // 当前层已经处理完 if (curr.isEmpty()) { // 步数加一 step++; // 处理下一层 Queue<Integer> temp = curr; curr = next; next = temp; } } // 执行到此说明找不到出路 return -1; }}
4 测试结果
5 其它信息
因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】。
2 0
- 【编程马拉松】【015-走迷宫】
- 编程马拉松----走迷宫
- 编程练习:走迷宫问题
- 编程练习:走迷宫问题后续
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 初见Android 6.0新特性
- android shardsdk 一键分享点击无界面问题
- maven配置setting.xml详解
- leetcode 28 Implement strStr() C++
- IOS培训实战教程之开发的21个奇葩技巧
- 【编程马拉松】【015-走迷宫】
- LeetCode 70. Climbing Stairs
- Android酷炫实用的开源框架(UI框架)
- ssh环境搭建(1.1)-lib maven 篇
- 发送邮件功能
- 异常之Java7捕获多种类型异常
- 【SQL】index索引
- [iOS] 使用WebViewJavascriptBridge实现OC与JS交互
- 【剑指offer】覆盖矩形