N皇后问题:在 n * n 的棋盘上要摆 n 个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上,求给一个整数 n ,返回 n 皇后的摆法数。

1.非递归调用:

#include <iostream>
#include <math.h>
#define N 8
using namespace std;
int q[N + 1];  //q[i]表示第i个皇后在第i行上的第q[i]列
int check(int j) { //检查N皇后摆放的位置是否合法
    for (int i = 1; i < j; i++) {
        if (q[i] == q[j] || abs(i-j)==abs(q[i]-q[j])) { //判断是否在同一列或同一斜线上
            return 0;
        }
    }
    return 1;
}
void queen() {
    for (int i = 1; i <= N; i++) {
        q[i] = 0;//初始化
    }
    int answer = 0;//方案数
    int j = 1; //表示正在摆放第j个皇后
    while (j >= 1) {
        q[j]++; //让第j个皇后向后一列摆放
        while (q[j]<=N && !check(j)) {//判断第j个皇后的位置是否合法
            q[j]++; //不合法就往后一个位置摆放
        }
        if (q[j] <= N) { //表示第j个皇后找到一个合法的摆放位置
            if (j == N) {//找到了N皇后的一组解
                answer++;
                cout << "方案" << answer << ":";
                for (int i = 1; i <= N; i++) {
                    cout << q[i] << " ";
                }
                cout << endl;
            }
            else {
                j++;//继续摆放下一个皇后
            }
        }
        else {//表示第j个皇后找不到一个合法的摆放位置
            q[j] = 0;//还原第j个皇后的位置
            j--;//回溯
        }
    }
}
int main() {
    queen();

    system("pause");
    return 0;
}

2.递归调用:

#include <iostream>
#include <math.h>
#define N 8
using namespace std;
int answer = 0;//方案数
int q[N + 1]; //q[i]表示第i个皇后在第i行上的第q[i]列
int check(int j) { //检查N皇后摆放的位置是否合法
    for (int i = 1; i < j; i++) {
        if (q[i] == q[j] || abs(i-j)==abs(q[i]-q[j])) { //判断是否在同一列或同一斜线上
            return 0;
        }
    }
    return 1;
}
void queen(int j) {
    for (int i = 1; i <= N; i++) {
        q[j] = i;
        if (check(j)) { //当摆放的皇后位置合法时
            if (j == N) { //找到了N皇后的一组解
                answer++;
                cout << "方案" << answer << "";
                for (int i = 1; i <= N; i++) {
                    cout << q[i] << " ";
                }
                cout << endl;
            }
            else {
                queen(j+1);//递归摆放下一个皇后的位置
            }
        }
    }
}
int main() {
    queen(1);

    system("pause");
    return 0;
}

posted on 2023-08-05 15:12  wshidaboss  阅读(341)  评论(0编辑  收藏  举报