递归
递归就是方法自己调用自己。
- 递归调用必须有结束条件
- 每一次调用要接近结束递归的条件,否则会栈溢出。
- 递归不能太深否则也会栈溢出
迷宫
- 用二维数组数组模拟迷宫,数字1 表示墙,数字0表示没走过,数字2表示走过,数字3表示走不通。
- 假设 从1,1 坐标开始走,走到 6,6 坐标表示走出迷宫
class Maze(){
//二维数组 模拟迷宫
int[][] array;
//构造方法 传入迷宫数组的大小
public Maze(int [][] array){
this.array=array;
//迷宫围墙 横
for(int i=0;i<array[0].leng;i++){
array[0][i]=1;
array[array.leng-1][i]=1;
}
//迷宫围墙 竖
for(int i=0;i<array.leng;i++){
array[i][0]=1;
array[i][array[0]-1]=1;
}
//迷宫内部 简单障碍物
array[2][2]=1;
array[2][1]=1;
}
}
走迷宫方法
public boolean run(int [][] array,int x,int y){
//判断一下是否走出迷宫
if(arrya[6][6]==2){
//表示走出迷宫 反回一个TRUE ,并输出迷宫
System.out.prinltn(array);
return turn;
}
//判断,此路是否走过 0表示没走过
if(array[x][y]==0){
//默认标记2 表示此坐标已走过,上下左右都走不同则走不同
if(run(array,x+1,y)){
return true;
}else if(run(array,x-1,y)){
return ture;
}else if(run(array,x,y+1)){
return true;
}else if(run(array,x,y-1)){
return true;
}else if{
//当发现4个方向都走不通是,把当前坐标修改内容修改为3
array[x][y]=3;
}
}else{//走到这表示可能是 2已经走过 ,3无法走通,1是迷宫墙壁。返回false
return false;
}
}
测试程序
public Test{
public static void main(String[]args){
//创建迷宫
Maze maze=new Maze(new int[8][8]);
//调用run方法
maze.run(maze.array,1,1);
}
}
迷宫回溯算法。
- 该递归会继续上下左右尝试走出迷宫,若无法走出迷宫则会返回上一部,继续进行尝试
- 列如递归会一直向下走,若能走到迷宫出口,则不需要回溯,若找不到,则会返回上一步,尝试往右左上走,直到把迷宫出口找出来或尝试完所有路径