原创 进阶算法概述
四.回溯算法
1.算法本质
- 解决多选择问题
- 选择时判断,符合条件继续,不符合条件返回
- 把问题的解空间转化成了图(深度优先)或者树(左右根)的结构表示。
2.算法步骤
2.1 算法基本的步骤思想为:
- 在搜索过程中动态产生问题的解空间
- 只保存从根结点到当前扩张结点的路径
- 深度优先方式搜索解空间,能找出满足约束条件的所有解
2.2 伪代码:
1 | def Backtrack(t) |
3.回溯算法应用
3.1 八皇后问题
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?
为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解
- Input
无输入
- Output
多种
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
No. 3
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 - 求解思路
观察棋盘坐标
同一斜线上的“/”上的坐标点,横纵坐标之和相同
同一斜线上的“\”上的坐标点,横纵坐标之差相同
- 基本步骤
- 判断皇后冲突
- 递归得到结果
- 输出所有结果
- 代码
1 | # state是一个元组,存放每行的坐标,从首行开始 |