回溯算法

思想

笼统的讲,回溯算法主要应用在搜索问题中,这不是简单的图搜索等,主要是从一组可能的解中,寻找一组满足期望的解。

回溯的处理思想,有点类似枚举搜索。我们枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。

经典例题

八皇后

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值