java递归-迷宫问题

128 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情

迷宫问题

说明:

1) 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关

先写一个小球的路径函数,

使用递归回溯给小球找路,能找到就返回true,找不到就给返回False,要有地图和找的起始位置
假设初始值为1,1,如何能够到达目的地6,5

约定:当map[][]为0表示该点没有走过,若为1则表示该点是墙,2表示通路可以走,3表示该点走过,但尚未走通,回溯到之前的路

在走迷宫的时候,还需要设置一个策略(方法),下->右->上->左,如果该点走不通,再进行回溯

代码实现

public static boolean setway(int[][] map,int i,int j){  
    //通路已经找到了  
    if(map[6][5]==2){  
        return true;  
    } else {  
        if(map[i][j]==0){ //按照策略进行查询 下->右->上->左,如果该点走不通,再进行回溯  
            map[i][j]=2;  //假定该点可以走通  
            if(setway(map,i+1,j)){  //向下走  
                return true;  
            }  else if(setway(map,i,j+1)){//向右走  
                return true;  
            }  else if(setway(map,i-1,j)){//向上走  
                return true;  
            } else if(setway(map,i,j-1)){//向左走  
                return true;  
            } else {  
                //说明该点不通,是一条死路  
                map[i][j]=3;  
                return false;  
            }  
        } else {  //只有三种情况,1,2,3  
            return false;  
        }  
    }  
}

2) 再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变

//    在走迷宫的时候,还需要设置一个策略(方法),上->右->下->左,  
public static boolean setway2(int[][] map,int i,int j){  
    //通路已经找到了  
    if(map[6][5]==2){  
        return true;  
    } else {  
        if(map[i][j]==0){ //按照策略进行查询 上->右->下->左,如果该点走不通,再进行回溯  
            map[i][j]=2;  //假定该点可以走通  
            if(setway2(map,i-1,j)){  //向上走  
                return true;  
            }  else if(setway2(map,i,j+1)){//向右走  
                return true;  
            }  else if(setway2(map,i+1,j)){//向下走  
                return true;  
            } else if(setway2(map,i,j-1)){//向左走  
                return true;  
            } else {  
                //说明该点不通,是一条死路  
                map[i][j]=3;  
                return false;  
            }  
        } else {  //只有三种情况,1,2,3  
            return false;  
        }  
    }  
}

3)思考:如何求出最短路径?

在不学其他策略的情况下,要求出最短路径只需要通过更改下->右->上->左到上->右->下->左方向或者其他方向,不断进行测试