概念:
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
示例:八皇后算法
//棋盘格子的范围
let max_num = 8
//数组作为棋盘
var chessBoard = [[Int]]()
//生成棋盘基础数据
for _ in 1...max_num {
var row = [Int]()
for _ in 1...max_num {
row.append(0)
}
chessBoard.append(row)
}
判断落子是否合规
func check(x:Int,y:Int) -> Bool
{
for i in 0..<y {
//检查纵向
if chessBoard[x][i] == 1
{
return false
}
//检查左侧斜向
if (x - i - 1 >= 0 && chessBoard[x - i - 1][y - i - 1] == 1)
{
return false
}
//检查右侧斜向
if (x + i + 1 < max_num && chessBoard[x + i + 1][y - i - 1] == 1)
{
return false
}
}
return true
}
进行递归回溯
func settleQueen(_ y:Int) -> Bool
{
//放满8个棋子了,已经找到答案
if (y == max_num)
{
return true
}
//遍历当前行,验证每一格
for i in 0..<max_num
{
//晴空当前行数据,以免出现脏数据
for x in 0..<max_num
{
chessBoard[x][y] = 0
}
//检查是否合规,合规进行下一步递归
if check(x: i, y: y)
{
chessBoard[i][y] = 1
//如返回true,证明已经找到结果,不需要再次递归
if settleQueen(y + 1)
{
return true
}
}
}
return false
}
测试
if settleQueen(0)
{
for i in 0..<max_num
{
print(chessBoard[i])
}
}
结果:
[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]
参考:程序员小灰