利用递归来解决迷宫问题。
问题描述:有一个由二维数组组成得矩阵,希望从左上角走到左下角,提供一个可行得路线,假设数字1代表墙
解题思路:首先利用二维数组将此地图模拟出来,
// 利用二位数组模拟一个地图
int[][] map = new int[8][7];
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[4][3] = 1;
map[4][2] = 1;
map[4][1] = 1;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
递归程序分析:
首先递归程序会在栈中开辟n多个栈结构,其中引用类型数据是这些结构中唯一共享得数据,所以将二维数组传入递归算法中,这样每次递归就可穷举路径。这里将左上角定为起始路径,右下角定位终止路径。在本程序中1代表墙体,2代表走过得区域,3代表本区域无法走通。其次程序需要制定一个策略,告诉程序应该按照什么规则去探索下一个区域。此方法制定得策略为:下->右->上->左。
public static boolean getWay(int[][] map, int i, int j) {
if (map[6][5] == 2) {
return true;
} else {
if (map[i][j] == 0) {
map[i][j] = 2;
if (getWay(map, i + 1, j)) {
return true;
} else if (getWay(map, i, j + 1)) {
return true;
} else if (getWay(map, i - 1, j)) {
return true;
} else if (getWay(map, i, j - 1)) {
return true;
} else {
map[i][j] = 3;
return false;
}
} else {
return false;
}
}
}
本程序核心就是对递归得理解。最终程序得输出为: