Back Tracking
◼ 回溯可以理解为:通过选择不同的岔路口来通往目的地(找到想要的结果)
每一步都选择一条路出发,能进则进,不能进则退回上一步(回溯),换一条路再试
◼ 树、图的深度优先搜索(DFS)、八皇后、走迷宫都是典型的回溯应用
回溯很适合使用递归
四皇后问题
剪枝
不用考虑不符合规则的格子
八皇后问题
◼ 八皇后问题是一个古老而著名的问题
在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击:任意两个皇后都不能处于同一行、同一列、同一斜线上
请问有多少种摆法?
解决思路
思路一:暴力(这里是组合,不是排列,不关心摆放顺序)
从 64 个格子中选出任意 8 个格子摆放皇后,检查每一种摆法的可行性
一共 C 64—8种摆法(大概是 4.4 ∗ 109 种摆法)
** 思路二:根据题意减小暴力程度**
很显然,每一行只能放一个皇后,所以共有 88 种摆法(16777216 种),检查每一种摆法的可行性
第一行有8种排法,第二行只有7种摆法,因为不同列,但是一开始要把第二行先遍历一遍才能找出那个已经排过的位置,遍历次数还是8^8
思路三:回溯法
回溯 + 剪枝
回溯法
选择了第一行就选择下一行,白色区域是可选的地方,绿色区域是不能选的。
选择一条路就剪枝(递归操作)
发现下一行走不通了,回到上上一行做选择(即第三行)
代码实现
public class Queens1 {
public static void main(String[] args) {
new Queens1().placeQueens(1