回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。
下面介绍两个由回溯法解决的问题:
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;
}