常用算法思想(二)——回溯法

本文详细介绍了回溯法的基本思想及应用,通过深度优先搜索策略遍历解空间,结合剪枝函数优化搜索过程。以N皇后问题为例,展示了如何使用回溯法求解并给出具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。

求解步骤

1)针对所给问题,定义问题的解空间;

2)确定易于搜索的解空间结构;

3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

常用的剪枝函数:用约束函数在扩展结点处剪去不满足约束的子树;用限界函数剪去得不到最优解的子树。

下面介绍一个由回溯法解决的问题:

N皇后问题

N皇后问题是指在N*N的棋盘上放置N个皇后,使这N个皇后无法吃掉对方(也就是说两两不在一行,不在一列,也不在对角线上)。

using namespace std;

int queenCount = 0;
//判断第last行上插入皇后的可行性
int check(vector<int>& arr, int last) {

	for (int i = 0; i < last;i++) {
		if ((arr[i] == arr[last]) || (abs(i - last) == abs(arr[i] - arr[last])))
			return false;
	}
	
	return true;
}

void queen(vector<int>& arr,int i,int n) {

	if (i >= n) {
		queenCount++;
	}
	else {
		for (int j = 0; j < n; j++) {
			arr[i] = j;
			if (check(arr, i)) {
				queen(arr, i + 1, n);
			}
		}
	}


}



int main()
{
	int n = 8;
	vector<int> arr(n,0);           //保存每一行上皇后的列数
	queen(arr, 0, 8);
	//for_each(arr.begin(), arr.end(), [](int x) { cout << x << ends; });
	cout << queenCount << endl;
	system("pause");
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值