算法 迷宫算法总结(总路径数)

@author:Jingdai
@date:2020.11.20

上篇总结了一下迷宫最短路径的解法,这篇总结一下迷宫中从起点到终点总路径条数的解法。

题目描述

这里给出一个典型求迷宫总路径的题目,来源洛谷题目P1605。

给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

输入描述:

第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。

  • 输入示例:

    2 2 1
    1 1 2 2
    1 2
    
  • 输出示例

    1
    

思路及代码

在上篇求迷宫最短路径的的解法中,使用了 bfs,而求总路径数时,一般使用 dfs,dfs 本质就是暴力求解,即我们需要走完每一条可能的路径,每找到一条路径就使总路径数加一。

其实整体思路很简单,用一个全局变量 totalMethods 记录总路径数和访问数组 visited ,我们从起点出发进行 dfs,只要下一步不是出界、障碍或已经访问过,则继续对下一个点进行 dfs,遍历到终点就使 totalMethods 加一并返回,如果没有路可走了也返回。当对该点的所有情况遍历完之后就回溯,将该点标记为未访问过。代码如下。

代码

import java.util.*;public class Main {public static int row;public static int column;// is blockedpublic static boolean[][] maze;// is visitedpublic static boolean[][] visited;public static int[] start;public static int[] end;public static int totalMethods = 0;public static void main(String[] args) {Scanner s = new Scanner(System.in);row = s.nextInt();column = s.nextInt();int t = s.nextInt();maze = new boolean[row][column];visited = new boolean[row][column];start = new int[2];end = new int[2];start[0] = s.nextInt() - 1;start[1] = s.nextInt() - 1;end[0] = s.nextInt() - 1;end[1] = s.nextInt() - 1;for (int i = 0; i < t; i++) {int x = s.nextInt() - 1;int y = s.nextInt() - 1;maze[x][y] = true;}dfsPath(start);System.out.println(totalMethods);}public static void dfsPath(final int[] node) {if (node[0] == end[0] && node[1] == end[1]) {totalMethods ++;return;}int[][] direction = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};// visit current nodevisited[node[0]][node[1]] = true;// visit nextfor (int i = 0; i < 4; i++) {if (node[0] + direction[i][0] >= 0&& node[0] + direction[i][0] < row&& node[1] + direction[i][1] >= 0&& node[1] + direction[i][1] < column&& !maze[node[0] + direction[i][0]][node[1] + direction[i][1]]&& !visited[node[0] + direction[i][0]][node[1] + direction[i][1]]) {dfsPath(new int[]{node[0] + direction[i][0], node[1] + direction[i][1]});}}visited[node[0]][node[1]] = false;}}

Tips

同时,对上述代码稍作修改就可以求迷宫最短路径的长度,用两个全局变量记录最短路径长度和当前路径长度,当找到解时如果当前路径长度比最短路径长度短就更新最短路径长度,每遍历一个点就使当前路径长度加一,同时回溯时使当前路径长度减一。

参考

  • 题目

迷宫算法总结(总路径数、方法数)相关推荐

  1. 获取PDF文件的总页数

    获取PDF文件总页数 方法一 1.导入JAR包 <dependency><groupId>com.itextpdf</groupId><artifactId& ...

  2. 分页总数计算,根据总记录数获取分页总数_ZZGoals

    分页总数计算,根据总记录数获取分页总数,本文章提供5种写法,大家感觉哪个好用就拿去用吧. int pageSize = 20; //每页记录数量 int totalCount = 100005; // ...

  3. 获取指定路径下所有PDF文件的总页数

    在开发过程中遇见了这样一个问题,某个文件夹下包含了很多PDF文件,现在要统计这些文件的总页数,当然可以逐个打开,然后将页数累加起来,但是相对来说很麻烦,于是写了一个winform的程序,来实现页数的统 ...

  4. 动态规划C++实现--换钱的方法数(二)(动态规划及其改进方法)

    题目:换钱的方法数 给定数组 arr, arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法. 将原文的伪代 ...

  5. 【算法-Java实现】 换钱的方法数(暴力递归法)

    [算法-Java实现] 换钱的方法数(暴力递归法) 文章目录 [算法-Java实现] 换钱的方法数(暴力递归法) 一.问题描述: 二.问题解答: **举例:** **思路:==暴力递归==** 三.算 ...

  6. 动态规划:得到目标货币的方法数(有限张货币 + 面值相同的货币相同)

    1.题目 arr 是货币数组,其中的值都是正数. 再给定一个正数 aim. 每个值都认为是一张货币,认为值相同的货币没有任何不同,返回组成 aim 的方法数. 例如:arr = {1,2,1,1,2, ...

  7. 使用OpenCV和Python高效计算视频的总帧数

    使用OpenCV和Python高效计算视频的总帧数 1. 效果图 2. 源码 参考 这篇博客将介绍两种使用OpenCV和Python计算视频文件中帧数的方法. 超级快,它依靠OpenCV的视频属性功能 ...

  8. 【工具】统计jar包和apk中的java方法数

    2019独角兽企业重金招聘Python工程师标准>>> [工具]统计jar包和apk中的java方法数 :http://www.baidufe.com/item/5891ec6f73 ...

  9. Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚

    时之沙: http://blog.csdn.net/t12x3456 随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多 ...

  10. Py之Xlrd:Xlrd简介、安装、使用方法(读取xlsx文件的shee表头名/总行数/总列数、每一行的内容、指定列的内容)之详细攻略

    Py之Xlrd:Xlrd简介.安装.使用方法(读取xlsx文件的shee表头名/总行数/总列数.每一行的内容.指定列的内容)之详细攻略  导读      xlrd,xlwt和xlutils是用Pyth ...

最新文章

  1. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)
  2. python mac电脑定时关机怎么设置_python实现电脑定时关机
  3. 互联网思维与非摩擦经济
  4. 通过反射动态调用webservices
  5. Vue3.0 组合式 API 分析与实践
  6. 做了一个网页,顺便录制了一个视频,大家看看高端不
  7. codeforces 1045 D. Interstellar battle
  8. checkbox怎么判断是否选中
  9. oracle 仲宏伟,Oracle数据库Merge的使用
  10. MDK472a(Keil4)注册不成功问题
  11. 从实战进阶系列之DNF脚本实战
  12. SQL 中round(),floor(),ceiling()函数的用法和区别
  13. 教你如何赚取你的第一桶金 - 2048(含源码)
  14. 30_ElasticSearch IK分词器配置文件 以及自定义词库
  15. CAD删不掉的顽固图层及简单优化
  16. 计算机网络及应用【2】
  17. 图片怎么做雕刻路径_精雕图怎么做路径
  18. 电路分析 笔记整理(模拟电子电路)
  19. 大数据hadoop集群运算
  20. 远程连接windows 2012 是报出“出现身份验证错误,要求的函数不受支持”解决方法”

热门文章

  1. CVE-2018-5767 栈溢出漏洞复现
  2. 使用YYLabel小结,供参考
  3. 空间解析几何 | 空间曲线的切向量与曲面的法向量
  4. 华为鸿蒙deveco studio编译时提示Browserslist: caniuse-lite is outdated的解决办法
  5. 微信公众号视频下载教程
  6. PLC开发没有前景想转行嵌入式,找个培训机构还是自学?
  7. 贝叶斯信息融合 MATLAB,信息融合理论研究进展:基于变分贝叶斯的联合优化
  8. OKHttp原理讲解之责任链模式及扩展
  9. 数学中矩阵乘积转置等的相关求导
  10. SPSS中常用的几种t检验实例操作