迷宫问题2-在给定的迷宫中计算从起点到终点的路径数目
2016-09-19 11:00
603 查看
问题描述
给定一个迷宫,也即一个矩阵,矩阵中由数字0和1 组成,其中,0表示当前位置可以通行,而1表示当前位置是障碍物,如迷宫中的砖墙,无法通行,再给定一个起点和一个目标点,请计算从起点到目标点可行的路径条数。(注:起点和终点一定可通行,即对一个的位置都是0)解法
这里使用深度优先搜索+回溯的方法进行可行路径的判断输入输出及状态说明
0–可通行1–障碍物
迷宫矩阵5x5
{
{0,1,0,0,1},
{0,0,1,1,1},
{1,0,0,0,0},
{1,0,1,1,0},
{1,0,0,0,0},
}
起点 (0,0)
终点(4,4)
输出
起点–>终点的输出路径的条数
如果条数大于0,则输出每一条路径的行进过程
算法描述
import java.util.LinkedList; /** * Created by ChaoNi on 2016/9/19. */ public class DFS { //输入的迷宫矩阵 private static int[][] matrix= { {0,1,0,0,1}, {0,0,1,1,1}, {1,0,0,0,0}, {1,0,1,1,0}, {1,0,0,0,0}, }; //迷宫的宽度 private static int width=5; //迷宫的高度 private static int heigth=5; //标记迷宫中各个位置是否已经被走过 private static boolean[][] flag=null; //在迷宫中的移动方向 private static int[][] direction={ {0,1}, {0,-1}, {-1,0}, {1,0} }; //存在的路径条数 private static int count=0; public static void main(String[] args) { //起始点 Point start=new Point(0,0); //目标点 Point end=new Point(width-1,heigth-1); flag=new boolean[width][heigth]; LinkedList<Point> linkedList=new LinkedList<>(); linkedList.add(start); countPath(start,end,linkedList); System.out.println("exist "+count+" pathes" ); } //找到有多少条路径 public static void countPath(Point start,Point end,LinkedList<Point> linkedList){ //到达目标点,表明找到一条路径 if(start.getX()==end.getX()&&start.getY()==end.getY()){ count++; //输出路径 for(Point p:linkedList){ System.out.print(p+"->"); } System.out.println(); return; } //从四个方向进行再次遍历 for(int i=0;i<4;i++){ int nx=start.getX()+direction[i][0]; int ny=start.getY()+direction[i][1]; //检验方向的合法性 if(nx>=0&&nx<width&&ny>=0&&ny<heigth&&flag[nx][ny]==false&&matrix[nx][ny]==0){ Point next=new Point(nx,ny); flag[nx][ny]=true; linkedList.add(next); countPath(next,end,linkedList); //当前这个方向不能完成,则回退到前一个结果,进行再次探索 flag[nx][ny]=false; linkedList.removeLast(); } } } } //位置点的辅助类 class Point { private int x; private int y; public Point(int xx, int yy){ this.x=xx; this.y=yy; } public int getX() { return x; } public int getY() { return y; } @Override public String toString() { return "[" + x + ", "+y+"]"; } }
结果
在以上给定的矩阵中,输入的路径条数是2,对应的行走路径如下:[0, 0]->[1, 0]->[1, 1]->[2, 1]->[2, 2]->[2, 3]->[2, 4]->[3, 4]->[4, 4]->[4, 4]
[0, 0]->[1, 0]->[1, 1]->[2, 1]->[3, 1]->[4, 1]->[4, 2]->[4, 3]->[4, 4]->[4, 4]
exist 2 pathes
相关文章推荐
- 迷宫问题1-在给定的迷宫中判断是否存在一条路径从起点到终点
- 迷宫问题:利用BFS打印出从起点到终点的路径(java版)
- hdu 2680 最短路径 多起点一终点问题
- 5X5迷宫,求起点和终点的最短路径以及最短路径个数(百分数)
- 【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次
- bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数.
- poj 3984 迷宫问题 学会了一招计算路径
- C++利用队列(Queue)求解迷宫(Maze)中指定起点和终点间是否有最短路径,如果有的话输出所需步数,如果没有输出
- 迷宫的最短路径(BFS,起点到终点)
- 寻路问题--如何找到一条从起点坐标到终点坐标的路径?
- (阶段三 dijkstra算法温习1.2)HDU 2066 一个人的旅行(使用dijkstra来解决多源起点和多源终点的最短路径问题)
- ZOJ1940 POJ2251 Dungeon Master 求三维迷宫路径问题,广度优先搜索
- 迷宫路径搜索问题(栈的链表实现)
- 实现迷宫问题的所有路径及最短路径程序
- poj 3984 迷宫问题(BFS+输出路径)
- poj3984(DFS写法) 迷宫路径问题
- Fast bit count问题(即计算一个unsigned int的二进制表达中1的数目)
- poj 3984 迷宫问题 dfs 求迷宫路径
- algo3-4-3.c 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)
- poj3984迷宫问题 广搜+最短路径+模拟队列