开启掘金成长之旅!这是我参与「掘金日新计划 · 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)思考:如何求出最短路径?
在不学其他策略的情况下,要求出最短路径只需要通过更改下->右->上->左到上->右->下->左方向或者其他方向,不断进行测试