Chapter 5 递归
5.1 递归概念
- 递归好就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得更简洁
5.2 递归的调用机制
5.3 迷宫问题(回溯)
思路:
-
设置迷宫和挡板
-
传入迷宫和起始位置
-
如果到达终点 终点==2 则返回true表示找到通路
-
如果当前的点为0,表示点没有走过,将点先设为2表示走过该点
4.1 按照下->右->上->左的方向走,如果是通路,返回true
4.2 否则将该点设为3,表示可以走但是不通,返回false
-
其他情况,即当前点为1、2、3,则返回false
实现:
public class Maze {
public static void main(String[] args) {
//迷宫地图
int[][] maze = new int[8][8];
for (int i=0;i<8;++i){
maze[0][i] = 1;
maze[7][i] = 1;
maze[i][0] = 1;
maze[i][7] = 1;
}
//设置挡板
maze[3][1] = 1;
maze[3][2] = 1;
maze[2][2] = 1;
maze[2][4] = 1;
maze[2][5] = 1;
maze[3][4] = 1;
maze[4][4] = 1;
maze[5][4] = 1;
maze[5][3] = 1;
maze[5][2] = 1;
maze[6][2] = 1;
maze[4][6] = 1;
maze[4][6] = 1;
//寻找通路
setWay(maze, 1, 1);
for(int row[] : maze){
for(int column : row){
System.out.print(column+" ");
}
System.out.println();
}
}
/**
* 寻找迷宫通路
* @param maze 迷宫地图
* @param i 从第i行第j列开始
* @param j 从第i行第j列开始
* @return 找到通路返回true,否则返回false
*/
public static boolean setWay(int[][] maze, int i, int j){
if(maze[6][6]==2){
return true;
}
if(maze[i][j]==0) {
maze[i][j] = 2;
if (setWay(maze, i + 1, j)) {
return true;
} else if (setWay(maze, i, j+1)) {
return true;
} else if (setWay(maze, i - 1, j)) {
return true;
} else if (setWay(maze, i, j - 1)) {
return true;
} else {
maze[i][j] = 3;
return false;
}
} else {
return false;
}
}
}
5.4 八皇后问题(回溯)
思路:
实现:
public class Queen {
static int max = 8;
static int[] result = new int[max];
static int count = 0;
public static void main(String[] args) {
check(0);
System.out.println("一共有"+count+"种解法");
}
public static void check(int n){
if(n==max){//如果为max说明第八个皇后已经放置好,得到一个解
print();
return;
}
for (int i=0;i<max;++i){//循环列
result[n] = i;//将皇后放置到第i列
if (judge(n)){//判断是否冲突,如果不冲突
check(n+1);//放置下一个皇后,递归
}
}
}
/**
* 检查皇后是否在同一列,同一斜线
* @param n 表示放置第n个皇后
* @return 如果在同一列或者同一斜线返回false,否则返回true
*/
public static boolean judge(int n){
for (int i=0;i<n;++i){
if (result[n]==result[i] || Math.abs(result[n]-result[i])==Math.abs(n-i)){
return false;
}
}
return true;
}
public static void print(){
count++;
for (int i=0;i< result.length;++i){
System.out.print(result[i]+" ");
}
System.out.println();
}
}