百度真题之走迷宫

Posted 且听风吟-wuchao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度真题之走迷宫相关的知识,希望对你有一定的参考价值。

题目:

给定一个矩阵,元素1表示可走路径,0表示不可走路径,从左上角开始,目标是值为9的坐标点,判断是否有一个路径到达目的地。如:

1 0 0 0 1 0

1 1 0 0 1 0

0 1 1 9 0 0

0 0 0 1 0 0

该矩阵存在到达数值为9的点的路径

 

分析:

这题和上一题城市规划的思路一致,只不过这里只要选取左上角第一个点即可。将已搜索的点放入到一个list。

 

代码:

package project001;
import java.util.ArrayList;
import java.util.List;



public class Main14 {

    public static List<int[]> markedList = new ArrayList<int[]>();//存放已搜索的点
    public static List<int[]> routeList = new ArrayList<int[]>();//存储路径,路径是由终点到起点
    public static void main(String[] args) {

        int[][] maze = {{1,1,0,0,0},
                        {0,1,0,0,0},
                        {0,1,1,1,0},
                        {1,1,0,9,0},
                        {0,1,0,1,1}};
        
        System.out.println(getRoute(fillM(maze)));
        printRoute(routeList);
    }
    public static boolean getRoute(int[][] M){
        markPoint(1,1,M);
        //当routeList的大小大于1,说明存在路径到达目标
        return routeList.size()>0;
    }
    

    public static int[][] fillM(int[][] M){
        int row = M.length;
        int col = M[0].length;
        int[][] M2 = new int[row+2][col+2];
        for(int i = 1;i<=row;i++){
            for(int j=1;j<=col;j++){
                M2[i][j]=M[i-1][j-1];
            }
        }
        return M2;
    }
    
    //判断该点是否被标记
    public static boolean isMarked(int i,int j){
        int size = markedList.size();
        if(size<=0) return false;
        for(int k=0;k<size;k++){
            int[] m = markedList.get(k);
            if(m[0]==i&&m[1]==j) return true;
        }
        return false;
    }

    public static boolean markPoint(int i,int j,int[][] M){if(isMarked(i,j)) return false;
        
        //将该点标记,即放入一个list内
        int[] m = new int[]{i,j};
        markedList.add(m);
        
        
        if(M[i][j]==9) {
            routeList.add(m);
            return true;
        }
        
        
        
        //标记与点(i,j)相邻并且未被标记的点
        if(!isMarked(i-1,j)&&M[i-1][j]>=1){
            boolean res = markPoint(i-1,j,M);
            //当res为true,说明点(i,j)是正确路径点
            if(res){
                int[] m2 = new int[]{i-1,j-1};//之所以存放的点坐标为(i-1,j-1),是因为当前矩阵是原来矩阵扩充后的,所以真实路径坐标比(i,j)要小1.
                routeList.add(m2);
                return true;
            }
        }
        if(!isMarked(i,j-1)&&M[i][j-1]>=1) {
            boolean res = markPoint(i,j-1,M);
            if(res){
                int[] m2 = new int[]{i-1,j-1};
                routeList.add(m2);
                return true;
            }
        }
        if(!isMarked(i,j+1)&&M[i][j+1]>=1){
            boolean res = markPoint(i,j+1,M);
            if(res){
                int[] m2 = new int[]{i-1,j-1};
                routeList.add(m2);
                return true;
            }
        }
        if(!isMarked(i+1,j)&&M[i+1][j]>=1){
            boolean res = markPoint(i+1,j,M);
            if(res){
                int[] m2 = new int[]{i-1,j-1};
                routeList.add(m2);
                return true;
            }
        }
        
        return false;
    }
    //打印矩阵
    public static void printM(int[][] m){
        int row = m.length;
        int col = m[0].length;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                System.out.print(m[i][j]+" ");
            }
            System.out.println("");
        }
    }
    
    //打印坐标
    public static void printRoute(List<int[]> list){
        int size = list.size();
        if(size<=0) return;
        for(int i=size-1;i>=0;i--){
            int[] m =list.get(i);
            System.out.print("("+m[0]+","+m[1]+")-->");
        }
        System.out.println("");
    }

}

 

以上是关于百度真题之走迷宫的主要内容,如果未能解决你的问题,请参考以下文章

华为机试真题 Java 实现机器人走迷宫

华为机试真题 C++ 实现机器人走迷宫

华为机试真题 C++ 实现迷宫问题

蓝桥杯·寒假百校真题大联赛(大学B组)(第2期)《迷宫》(DFS版本)

蓝桥杯·寒假百校真题大联赛(大学B组)(第2期)《迷宫》(DFS版本)

2021年下半年软件设计师下午真题答案及解析