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

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

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

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;
}

 

点赞