Day560.递归 -数据结构和算法Java
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day560.递归 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。
递归
一、递归应用场景举例
二、递归基本概述
三、递归的调用机制
四、使用时注意的规则
五、递归问题
1、迷宫问题
package com.achang.recursion;
/**
* @Author Achang
* @Date 2022/3/15 21:22
* 递归---迷宫问题
**/
public class MiGong
public static void main(String[] args)
int[][] map = initMap();
for (int i = 0; i < map.length; i++)
for (int j = 0; j < 7; j++)
System.out.print(map[i][j] + "");
System.out.println();
System.out.println("===========");
setWay(map,1,1);
System.out.println("==========");
for (int i = 0; i < map.length; i++)
for (int j = 0; j < 7; j++)
System.out.print(map[i][j] + "");
System.out.println();
/**
*
* @param map 需要查找的地图
* @param i 行坐标
* @param j 列坐标
* @return 如果找到路返回T,反之为F
* 使用递归回溯,给小球找路
* 1、map表示地图
* 2、i,j表示从地图哪个位置触发(1,1)
* 3、如果小球能找到map[6][5]的位置,表示有通路
* 4、当map[i][j]为0时,表示还没走过该路,当为1时,为墙;为2时,表示通路可以走;为3时,表示该位置已经走了,但走不通
* 5、在走迷宫时,需要确定一个“策略”,下--->右--->上--->左,通过该点走不通,再回溯
*/
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;
else
//说明该点是死路
map[i][j] = 3;
else //如果map[i][j]不等于0,可能是 1/2/3
return false;
return false;
//初始化一个案例的map迷宫
private static int[][] initMap()
int[][] map = new int[8][7];//通过二维数组模拟迷宫
//1表示墙
//上下全部置为1
for (int i = 0; i < 7; i++)
//将上下行,全部置为1;
map[0][i] = 1;
map[7][i] = 1;
for (int i = 0; i < 8; i++)
//将左右列,全部置为1;
map[i][0] = 1;
map[i][6] = 1;
//设置挡板
map[3][1] = 1;
map[3][2] = 1;
return map;
2、八皇后问题
-
介绍
-
思路分析
-
示意图
-
代码实现
/**
* @Author Achang
* @Date 2022/3/17 21:18
* 八皇后问题
**/
public class Queue8
//主入口测试
public static void main(String[] args)
Queue8 queue8 = new Queue8();
queue8.check(0);
System.out.println("一共print()了 "+count+" 次");
//定义一个max,表示共有多少个皇后
int max = 8;
//保存皇后放置位置的结果
int[] arr = new int[max];
//打印次数计数器
static int count;
//放置第n个皇后
//check是每一次递归,进入到check中都有for循环一次,因此会有回溯
public void check(int n)
//n = 8,表示在放第9个皇后,表示已经不需要再放了,前8个已经放好了
if (n == max)
print();
return;
//没有结束的情况
//依次放入皇后,并判断是否冲突
for (int i = 0; i < max; i++)
//先帮当前这个皇后n,放到该行的第一列中
arr[n] = i;
//判断是否有冲突
if (judge(n))//不冲突
check(n+1);//接着放n+1个皇后,开始递归
//冲突
//就继续执行 arr[n] = i;即将第n个皇后,放置在本行的后一个位置
/**
* 查看当我们放置第n个皇后,就去检测该皇后是否和前面已经摆放的皇后冲突(同行/同斜/同列)
* @param n 表示第n个皇后
*/
public boolean judge(int n)
for (int i = 0; i < n; i++)
//说明他们在同一列 || 同斜(斜率相同)
if (arr[i] == arr[n] || Math.abs(n-i) == Math.abs(arr[n]-arr[i]))
return false;
return true;
//可以将皇后摆放的位置打印出来
public void print()
for (int item : arr)
System.out.print(item+"");
System.out.println();
count++;
以上是关于Day560.递归 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章