数据结构与算法(七):迷宫回溯和八皇后问题
2021-05-03 22:28
标签:如何 map 更换 设置 假设 string img script int 一个7*8的数组模拟迷宫,障碍用1表示,通路使用0表示,给定起点(1,1)和终点(6,5),要求给出起点到终点的通路 对于这个寻路程序,我们可以看见,往四个方向走的过程实际上除了方向外动作上是一样的;而具体分析同一个方向,每走过一个坐标的动作也是一样的,我们对流程进行分析: 表现为代码实际上就是一个递归的过程: 将 棋盘大小和障碍物位置不影响 皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出: 在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,求有多少种摆法? 首先,我们先使用一个长度为8数组来表示八皇后的摆放位置,数组下标+1即表示棋盘的第几行,数组下标对应的存放的数字+1即为棋盘的第几列。举个例子: arr = {0,2,3,8,4,6,2,7} 其中,元素0下标为0,即表示第一行第一列;元素2下标为1,即表示第二行第三列......以此类推。 任意假设任意坐标分标为 而任意坐标的皇后不允许在同一斜线,即 (注: 在前面明确了如何用数组表示位置,以及如何检查皇后是否允许摆放后,我们有如下代码: 接着我们需要考虑如何使用递归方法来做到以下效果: 使用一个方法遍历第n行的每一列,检查每一列是否可以放置皇后: 最终代码实现结果如下: 数据结构与算法(七):迷宫回溯和八皇后问题 标签:如何 map 更换 设置 假设 string img script int 原文地址:https://www.cnblogs.com/Createsequence/p/13196730.html一、迷宫回溯问题
1.问题
2.解题思路
3.代码实现
3.1生成地图
/**
* 创建一个二维数组,用于模拟8*7迷宫
* 使用1表示不可通过的实心方块,0表示可通过砖块
* (6,5)为默认终点,(1,1)为默认起点
* @return
*/
public static int[][] getMap(){
int[][] map = new int[8][7];
//上下全置为1
for(int i = 0;i
3.2 寻路逻辑的实现
int[x][y]==1
)
/**
* 给定起始点,根据地图找路
* 使用2表示可以走通的路,使用3表示走过但是不通的路
* @param map 地图二维数组
* @param x 起始点横坐标
* @param y 起始点纵坐标
* @return
*/
public static boolean findWay(int[][] map, int x, int y) {
//如果走到了终点就终止
if (map[6][5] == 2){
return true;
}else {
//只有为0的路才能通过
if (map[y][x] == 0) {
//如果该点可以走通就打上标记
map[y][x] = 2;
if (findWay(map, x, y + 1)) {
//向下递归
return true;
} else if (findWay(map, x + 1, y)) {
//向右递归
return true;
} else if (findWay(map, x, y - 1)) {
//向上递归
return true;
} else if (findWay(map, x - 1, y)) {
//向左递归
return true;
} else {
//都走不通说明是死胡同
map[y][x] = 3;
return false;
}
}else {
//不为0说明要么是死路要么是障碍
return false;
}
}
}
3.3 运行结果
findWay()
方法中的终止条件从map[6][5] == 2
换成其他坐标即可更换终点位置,findWay()
方法寻路。二、八皇后问题
1.问题
2.解题思路
(x1,y1),(x2,y2)
,也就是用数组表示为arr[x1]=y1,arr[x2]=y2
的两个皇后不允许在同一列,我们可以理解为:arr[x1] != arr[x2]
;(x2-x1)=(y2-y1)
,也就是斜率不应当相同,我们可以理解为:Math.abs(x2-x1) != Math.abs(arr[x2]-arr[x1])
Math.abs()
为求绝对值方法)3.代码实现
3.1 检查摆放位置的代码实现
//表示皇后位置的数组
int[] arr = new int[8];
/**
* 检查第n个皇后是否与前面摆放的皇后冲突
* @param n
* @return
*/
public boolean check(int n) {
//检查第n层之前的皇后位置
for (int i = 0; i
3.2 完整代码
/**
* @Author:黄成兴
* @Date:2020-06-26 20:53
* @Description:八皇后问题
*/
public class EightQueens {
public static void main(String[] args) {
EightQueens eightQueens = new EightQueens();
eightQueens.set(0);
System.out.println("共有摆法:" + eightQueens.count);
}
//记录八皇后有几种摆法
int count = 0;
//表示皇后位置的数组
int[] arr = new int[8];
/**
* 摆放皇后
* @param n 第几个皇后
*/
private void set(int n) {
//如果放置好了第8个皇后
if (n == 8){
show();
//记录一种摆放方式
count++;
//回到第一层继续递归
return;
}
//遍历第n行的每一列
for (int i = 0; i
上一篇:插入排序之直接插入排序
下一篇:Python跳一跳小游戏
文章标题:数据结构与算法(七):迷宫回溯和八皇后问题
文章链接:http://soscw.com/index.php/essay/81992.html