八皇后c++
八皇后问题是一个经典的回溯算法问题,它要求在一个8×8的国际象棋棋盘上放置8个皇后,使得任意两个皇后都不在同一行、同一列或同一条斜线上。这个问题有92种解法,我们可以用C++语言来实现其中一种。
为了解决这个问题,我们可以使用一个一维数组a[8]来表示皇后的位置,其中a[i]表示第i行的皇后所在的列号。例如,a[0]=3表示第0行的皇后在第3列。这样,我们就可以避免了同一行的冲突,只需要检查同一列和同一斜线的冲突即可。
我们可以用一个函数check(a,n)来判断第n行的皇后是否和前n-1行的皇后有冲突,具体的判断方法是:对于每一个前n-1行的皇后,如果它和第n行的皇后在同一列,或者它们的行差和列差相等(即在同一斜线上),则返回false,否则返回true。
我们可以用一个递归函数backtrack(k)来尝试放置第k行的皇后,具体的步骤是:如果k>8,说明已经找到了一个解,打印出数组a,并计数加一;否则,对于每一个可能的列号i(从0到7),将a[k]赋值为i,然后调用check(a,k)判断是否有冲突,如果没有冲突,则递归调用backtrack(k+1)继续放置下一行的皇后;最后将a[k]恢复为原来的值,以便回溯到上一层继续尝试其他列号。
下面是完整的C++代码:
#include <iostream>
#include <cmath>
using namespace std;
int a[8]; // 存放皇后位置的数组
int count = 0; // 存放解法数量
// 判断第n行的皇后是否和前n-1行的皇后有冲突
bool check(int a[], int n) {
for (int i = 0; i < n; i++) {
if (a[i] == a[n] || abs(a[i] - a[n]) == n - i) {
return false;
}
}
return true;
}
// 尝试放置第k行的皇后
void backtrack(int k) {
if (k > 7) { // 找到一个解
for (int i = 0; i < 8; i++) {
cout << a[i] << " ";
}
cout << endl;
count++;
} else {
for (int i = 0; i < 8; i++) { // 对于每一个可能的列号
a[k] = i; // 将第k行的皇后放在第i列
if (check(a, k)) { // 如果没有冲突
backtrack(k + 1); // 继续放置下一行的皇后
}
// a[k] = -1; // 恢复原来的值(可省略)
}
}
}
int main() {
backtrack(0); // 从第0行开始放置皇后
cout << "The number of solutions is " << count << endl;
return 0;
}

浙公网安备 33010602011771号