用递归来解决迷宫问题
递归,可以将复杂的问题简单化,一个比较好的用法是用来解决走迷宫问题。
现在首先要创建一个迷宫,
final int[][] ints = new int[6][8];
for (int i = 0; i < 8; i++) {
ints[0][i] = 1;
ints[5][i] = 1;
}
for (int i = 0; i < 6; i++) {
ints[i][0] = 1;
ints[i][7] = 1;
}
ints[3][1] = 1;
ints[3][2] = 1;
ints[3][3] = 1;
ints[3][4] = 1;
for (int i = 0; i < 6; i++) {
for(int j = 0; j < 8; j++){
System.out.print(ints[i][j]);
}
System.out.println();
}
输出结果为:
现在写一个方法来进行走迷宫,代码如下:
/**
* 假设从(1,1)开始走
* 0,代表没走过,1,代表是墙 2,代表走过可以走通,3,代表走过不可以走通
* @param ints 这个ints代表的是围墙
* @param i i,j代表的是起点
* @param j
* @return
*/
public static boolean setWay(int[][] ints, int i, int j){
//假设终点是ints[4][1]
if(ints[4][1] == 2){
return true;
}else if(ints[i][j] == 0){
//假设可以走通
ints[i][j] = 2;
//如果向下走一步可以到达则返回true
if(setWay(ints,i+1,j)){
return true;
//如果向右走一步可以到达则返回true
}else if(setWay(ints,i,j+1)){
return true;
}else if(setWay(ints,i-1,j)){
return true;
}else if(setWay(ints,i,j-1)){
return true;
}//如果下、右、上、左都走不通的话,那说明这个点肯定走不同了
else{
ints[i][j] = 3;
return false;
}
}else {
return false;
}
}
结果如下:
对这个2进行分析,当走到这里的时候,根据规则,他是先像上走一直走到最后一个,发现没地方可以走了,只能在执行ints[i][j] = 3,return false,此时,之前的setWay方法收到的是false,所以,也赋值3 返回false,直到方框中的2,这时候
//向右边走
else if(setWay(ints,i,j+1)){
return true;
}
可以确定向右边走是失败的,已经返回false,但是它左边的
//向左边走
else if(setWay(ints,i,j-1)){
return true;
}
左边的setWay(ints,i,j-1)这个判断语句还不知大返回什么,故开始向左边走。直到找到了目标位置。
这个迷宫问题走法是作者给的,如果要求最短路径的话,需要把各种走法的步数求取出来,看哪一个最小。