posts - 137,comments - 0,views - 40818

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   wshidaboss  阅读(362)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示