迷宫问题1-在给定的迷宫中判断是否存在一条路径从起点到终点

原创 2016年09月19日 10:52:05

问题描述

给定一个迷宫,也即一个矩阵,矩阵中由数字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)

输出
yes–表示从起点到终点存在一条路径
no–表示从起点到终点不存在一条路径

算法描述

/**
 * 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}
    };

    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];
        if(existPath(start,end)) System.out.println("yes");
        else System.out.println("no");
       );
   }

    //判断是否存在路径
    public static boolean existPath(Point start,Point end){
        //到达目标点
        if(start.getX()==end.getX()&&start.getY()==end.getY()){
            return true;
        }
        //从四个方向进行再次遍历
        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){
                //标记的位置需要对应一下
                flag[nx][ny]=true;
                if(existPath(new Point(nx,ny),end)) return true;
                //当前这个方向不能完成,则回退到前一个结果,进行再次探索
                flag[nx][ny]=false;
            }
        }
        return false;
    }  
}

//位置点的辅助类
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+"]";
    }
}

结果

在给定的测试迷宫矩阵中,输出的结果应为yes,也就是说存在从起点到终点的一条路径

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

5X5迷宫,求起点和终点的最短路径以及最短路径个数(百分数)

#include #include #define SIZE 5 typedef struct node{ int x; int y; int step; }node; //int maze...

利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)

// algo3-11.cpp 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径) #include"c1.h" #include"func3-1.cpp" #define D 8 // 移动方...

algo3-4-3.c 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)

/* algo3-11.c 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径) */  #include"c1.h"  #include"func3-1.c"  #define D 8 /...
  • sjmping
  • sjmping
  • 2012年11月10日 15:04
  • 735

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

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

hdu 2680 最短路径 多起点一终点问题

Choose the best route Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/O...
  • hpugym
  • hpugym
  • 2015年03月28日 17:43
  • 349

迷宫问题[1] DFS 不保证最短路径

#include #include #include #define M 5 #define N 5 bool found = false; struct cell { int c; ...

迷宫找路径,只要找到了一条就跳出

#include using namespace std; int n;int Maze[101][101]; bool vis[101][101]; struct unit//栈中的单元,记录...
  • jpday
  • jpday
  • 2012年11月19日 19:40
  • 692

迷宫算法,找出一条路径(不一定最短)

package graph;import java.util.Stack;/** * 迷宫算法 * * sovle:找出一条出路 * * 原因:无法回溯 * * 问题:如何才能找出...

(hdu step 4.3.1)Tempter of the Bone(在特定的时间约束下,判断是否能够从起点达到终点)

题目:Tempter of the BoneTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迷宫问题1-在给定的迷宫中判断是否存在一条路径从起点到终点
举报原因:
原因补充:

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