前言
学会了递归的实现原理后,我们就可以使用递归来解决一些简单的实际问题,本文讲解的是迷宫问题。
一、问题描述
给出一个大小为n*n的二维数组map,该数组表示的是一幅地图,1表示障碍物,0表示通路,给出起始坐标(s1,y1)和终点坐标(s2,y2),要求输出图中起始位置到终点位置的路径。
二、思路分析
这是一个经典的递归问题,首先我们从起始坐标开始,选择一个方向进行递归查找,如果找到终点坐标就递归结束找到路径,如果碰到障碍物就返回上一级进行回溯换另一个方向查找,最后回溯完了还没找到就递归结束没找到路径。
三、过程图解
图中对递归过程进行了非常详细的描述,也体现了回溯过程的所有细节,相信不懂递归的小伙伴看懂该图后一定能对递归有深刻的认识。
四、测试源码
package com.yc.recursion;
public class MiGong {
public static void main(String[] args) {
int [][] map = new int[][]{
{1,1,1,1,1,1,1},
{1,0,0,0,0,0,1},
{1,0,0,0,0,0,1},
{1,1,1,0,0,0,1},
{1,0,0,0,0,0,1},
{1,0,0,0,0,0,1},
{1,0,0,0,0,0,1},
{1,1,1,1,1,1,1}
};
for(int i=0;i<8;i++){
for(int y=0;y<7;y++){
System.out.print(map[i][y]+" ");
}
System.out.println();
}
System.out.println();
setWay(map,1,1);
for(int i=0;i<8;i++){
for(int y=0;y<7;y++){
System.out.print(map[i][y]+" ");
}
System.out.println();
}
}
/**
* 查找路径 2表示路径上的一点,3表示查找过的一点
* @param map
* @param i
* @param j
* @return
*/
private static boolean setWay(int[][] map, int i, int j) {
if(i==6&&j==5){
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,j-1)){//向上查找
return true;
}else if(setWay(map,i-1,j)){//向左查找
return true;
}else{
map[i][j] = 3;
return false;
}
}else{
return false;
}
}
}
}
总结
这是递归的第一个实际应用,弄懂了这个问题但不一定能弄懂其他的递归问题,希望我们能保持一颗虔诚的心,不断的学习,用学过的知识去解决更多的问题。