思想
笼统的讲,回溯算法主要应用在搜索问题中,这不是简单的图搜索等,主要是从一组可能的解中,寻找一组满足期望的解。
回溯的处理思想,有点类似枚举搜索。我们枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。
经典例题
八皇后
package main
import "fmt"
const MAX_ROW = 4
const MAX_COL = 4
var Res [MAX_ROW]int
func Cal8queue(row int) {
// 已经放满,退出打印放置分布图即可
if row == MAX_ROW {
fmt.Println(Res)
return
}
// 考察第row行,放置的位置
for col := 0; col < MAX_COL; col++ {
if IsOk(row, col) {
Res[row] = col
Cal8queue(row + 1)
}
}
}
func IsOk(row, col int) bool {
// row,col的左上方和右上方
leftUp := col - 1
rightUp := col + 1
for r := row - 1; r >= 0; r-- {
// 1,判断左上方
if leftUp >= 0 {
if Res[r] == leftUp {
return false
}
}
// 2,判断正上方
if Res[r] == col {
return false
}
// 3,判断右上方
if rightUp >= 0 {
if Res[r] == rightUp {
return false
}
}
leftUp--
rightUp++
}
return true
}
func main() {
Cal8queue(0)
}
背包问题
todo