递归的概念:递归就是方法自己调用自己,每次调用时传入不同的变量。
递归调用机制:借用打印问题讲述
迷宫问题:从左上到右下找可通行路径。
代码实现:
public class MiGong { public static void main(String[] args) { // TODO Auto-generated method stub //先创建一个二维数组,模拟迷宫 //地图 int[][] map=new int[8][7]; //使用1表示障碍物 //先用1,构成一个封闭空间 for(int i=0;i<8;i++) { map[i][0]=1; map[i][6]=1; } for(int i=0;i<7;i++) { map[0][i]=1; map[7][i]=1; } //封闭空间内设置障碍物 map[3][1]=1; map[3][2]=1; //使用递归回溯给小球找路 setWay(map,1,1); //输出新的地图,小球走过,并标识过的递归 System.out.println("小球走过,并标识过的地图的情况"); for(int i=0;i<7;i++) { for(int j=0;j<6;j++) { System.out.print(map[i][j]+" "); } System.out.println(); } } //使用递归回溯来给小球找路 //说明 //1.map 表示地图 //2.i,j表示从地图的哪个位置出发(1,1) //3.如果小球能够到达map[6][5],说明通路找到 //4.约定:当map[i][j]为0时表示该点没有走过 ;当为1时,表示障碍物;当为2时,表示通路可以走;当为3时,该点走过但不通。 //5.走迷宫的策略为下→右→上→左,如果走不通,则回溯 //return 如果找到通路,返回true。否则返回false 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)) { //xia return true; }else if(setWay(map,i,j+1)) { //you return true; }else if(setWay(map,i-1,j)) { //shang return true; }else if(setWay(map,i,j-1)) { return true; }else { //说明该点不通,死路 map[i][j]=3; return false; } }else { //如果map[i][j]!=0,可能是1,2,3 return false; } } } }