迷宫问题2-在给定的迷宫中计算从起点到终点的路径数目

原创 2016年09月19日 11:00:56

问题描述

给定一个迷宫,也即一个矩阵,矩阵中由数字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-在给定的迷宫中判断是否存在一条路径从起点到终点

问题描述给定一个迷宫,也即一个矩阵,矩阵中由数字0和1 组成,其中,0表示当前位置可以通行,而1表示当前位置是障碍物,如迷宫中的砖墙,无法通行,再给定一个起点和一个目标点,判断是否存在一个可行的路径,...

迷宫问题:利用BFS打印出从起点到终点的路径(java版)

输入一个n行m列的矩阵,每个单元格

bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数.

/*提供的输入数据: 输入行数列数 起点终点 然后输入任意点的位置,可求起点到终点的距离, 0 0 表示结束. input: 6 5 0 0 0 4 1 1 0 1 1 ...
  • ehi11
  • ehi11
  • 2012年07月21日 20:03
  • 1443

【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次

2016年小米校招笔试第一题(西安站) 1 给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次。 参考解法(Java版): package XiaoMi; /*******...

MFC迷宫问题(找出所有路径)

  • 2009年04月26日 23:15
  • 481KB
  • 下载

迷宫最短路径问题

  • 2011年11月22日 22:30
  • 3KB
  • 下载

Java 有向图的遍历,寻找所有从起点到终点的路径

最近遇到一个绘图的需求,是对地图的二次开发,在上面绘制覆盖物,所以这里涉及了对有向无环图的遍历问题。 如下图是一个有向无环图: 正常的深度优先遍历算法得到的结果会是:A、B、C、E、G、J、K、D...

数据结构迷宫最短路径问题

  • 2013年03月21日 16:23
  • 30KB
  • 下载

起点与终点重合的路径称为圈.

  • 2011年02月15日 16:23
  • 1.22MB
  • 下载

求无向无权图起点到终点的所有路径

求无向无权图起点到终点的所有路径 基本思路: 基于图的深度优先遍历进行修改。 0:初始栈中只有起点元素。 1:如果栈为空,则返回,否则,访问栈顶节点,但先不删除栈顶元素。 2:如果该元素的邻接点 ...
  • collonn
  • collonn
  • 2014年01月13日 15:43
  • 4070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迷宫问题2-在给定的迷宫中计算从起点到终点的路径数目
举报原因:
原因补充:

(最多只允许输入30个字)