递归与递归实现迷宫问题
递归就是方法自己调用自己,每次调用时传入不同的变量
递归需要遵守的重要规则
(1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
(2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量
(3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.
(4) 递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError)
(5) 当一个方法执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法 执行完毕或者返回时,该方法也就执行完毕
迷宫地图如上
1.设置一个数组来存储地图
2.设置数组的值为1表示墙,设置数组2的值为可以通过,设置3为这条路走不通
3.设置递归的方向
(1)向下再向右然后递归回来向上
(2)向上向右递归向下再向左
具体实现如下:
public class MiGong {
public static void main(String[] args) {
//用数组存储地图
int [][] map=new int[8][7];
//设置城墙
for (int i = 0; i <7 ; i++) {
map[0][i]=1;
map[7][i]=1;
}
//设置城墙
for (int i = 0; i <8 ; i++) {
map[i][0]=1;
map[i][6]=1;
}
//设置档块
map[3][1]=1;
map[3][2]=1;
// map[1][2]=1;
// map[2][2]=1;
//输出走之前的地图
for (int i = 0; i <8 ; i++) {
for (int j = 0; j <7 ; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
setWay(map,1,1);
System.out.println("--------------------------------------------");
//输出走以后的地图
for (int i = 0; i <8 ; i++) {
for (int j = 0; j <7 ; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
//递归实现走,先下再向右,走不通再递归回来,向上然后向左
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{
//可能为0或1或2
return false;
}
}
}
//路线先向上,再向右,路线不通,再向下,向左
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
{
//可能为0或1或2
return false;
}
}
}
}