主要用到了递归的思想,代码学习自B站尚硅谷的数据结构视频
迷宫问题
package recursive;
/**
* @author lzy
* @create 2022-02-27 9:19
* 迷宫回溯问题
*/
public class MiGong {
public static void main(String[] args) {
//用一个二维数组模拟迷宫
int[][] map = createMap();
showMap(map);
setWay(map, 1, 1);
System.out.println("-------------");
showMap(map);
}
/**
* 生成地图
*/
public static int[][] createMap(){
//创建一个二维数组模拟迷宫
int[][] map = new int[8][7];
//使用1表示墙,上下全部置1
for (int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;
}
//左右置1
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
//设置挡板
map[3][1] = 1;
map[3][2] = 1;
return map;
}
/**
* 输出地图
*/
public static void showMap(int[][] map){
//输出地图
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println("");
}
}
/**
* 使用递归来给小球寻路
* @param map 地图
* @param i 从哪个位置开始找
* @param j 从哪个位置开始找
* @return 如果找到通路,就返回true,否则返回false
* 小球从(1,1)出发,如果能到(6,5)位置,说明通路能找到
* map[i][j]表示0时,表示该点未走过;为1表示墙,无法通过;2表示通路可以走;3表示该位置已走过,但不通
* 策略:下->右->上->左,如果该点不通再回溯
*/
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)){
return true;
}else if (setWay(map, i, j + 1)){
return true;
}else if (setWay(map, i - 1, j)){
return true;
}else if (setWay(map, i, j - 1)){
return true;
}
//上下左右都不通,说明此路为死路
map[i][j] = 3;
return false;
}
//map[i][j] = 1,2,3 的情况
return false;
}
}
八皇后问题
package recursive;
/**
* @author lzy
* @create 2022-02-27 10:26
* 八皇后问题
* 在8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击
* 即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92)
*/
public class Queen8 {
/**
* 定义皇后的个数(8)和棋盘大小(8*8)
*/
static int max = 8;
static int[] arr = new int[max];
static int count = 0;
public static void main(String[] args) {
check(0);
System.out.println(count);
}
/**
* 输出皇后摆放的位置
*/
public static void showQueen(){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println("");
}
/**
* 当放置第n个皇后时,需检测该皇后是否和前面的皇后冲突
* n从0开始
*/
public static boolean judge(int n){
for (int i = 0; i < n; i++) {
//判断是否在同一列
if (arr[n] == arr[i]){
return false;
}
//同一斜线(横坐标之差和纵坐标之差相等,形成等腰直角三角形)
if (Math.abs(n - i) == Math.abs(arr[n] - arr[i])){
return false;
}
}
return true;
}
/**
* 放置第n个皇后
* n从0开始
*/
public static void check(int n){
//递归终止条件,n==8,说明前面8个皇后已放好(注意n从0开始)
if (n == max){
count++;
showQueen();
return;
}
//依次放入皇后,并判断是否冲突
for (int i = 0; i < max; i++) {
//从第1列开始放
arr[n] = i;
//判断皇后放到第i列时是否冲突
if (judge(n)) {
//不冲突,接着放n+1个皇后
check(n + 1);
}
//如果冲突,进行下一轮循环(i+1),皇后进行下一个位置的尝试
}
}
}