数据结构与算法之回溯法

Back Tracking

◼ 回溯可以理解为:通过选择不同的岔路口来通往目的地(找到想要的结果)
每一步都选择一条路出发,能进则进,不能进则退回上一步(回溯),换一条路再试

◼ 树、图的深度优先搜索(DFS)、八皇后、走迷宫都是典型的回溯应用
在这里插入图片描述
回溯很适合使用递归

四皇后问题

在这里插入图片描述

剪枝

不用考虑不符合规则的格子
在这里插入图片描述
在这里插入图片描述

八皇后问题

◼ 八皇后问题是一个古老而著名的问题
在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击:任意两个皇后都不能处于同一行、同一列、同一斜线上
请问有多少种摆法?
在这里插入图片描述

解决思路

思路一:暴力(这里是组合,不是排列,不关心摆放顺序)
从 64 个格子中选出任意 8 个格子摆放皇后,检查每一种摆法的可行性
一共 C 64—8种摆法(大概是 4.4 ∗ 109 种摆法)

** 思路二:根据题意减小暴力程度**
很显然,每一行只能放一个皇后,所以共有 88 种摆法(16777216 种),检查每一种摆法的可行性

第一行有8种排法,第二行只有7种摆法,因为不同列,但是一开始要把第二行先遍历一遍才能找出那个已经排过的位置,遍历次数还是8^8

思路三:回溯法
回溯 + 剪枝

回溯法

选择了第一行就选择下一行,白色区域是可选的地方,绿色区域是不能选的。
选择一条路就剪枝(递归操作)
在这里插入图片描述
在这里插入图片描述
发现下一行走不通了,回到上上一行做选择(即第三行)
在这里插入图片描述

代码实现

public class Queens1 {
   
	public stati
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值