递归解n皇后

95 阅读1分钟

题目描述:在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。


该算法有诸多解法,解的范围有很大区别。此处仅给出递归的解法,其他部分解法将在以后说明。


1 . 代码:

#include<iostream>
using namespace std;

const int N = 20;
int q[N];

void display(int n) {
    static int count = 0;
    int i, j;
    cout << "第" << ++count << "个解为:\n";
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++) {
            if (j == q[i])
                cout << "■ ";
            else
                cout << "□ ";
        }
        cout << endl;
    }
    cout << endl;
}
int place(int k, int j) {
    int i = 1;
    while (i < k) {
        if (q[i] == j || abs(q[i] - j) == abs(k - i)) {
            return 0;
        }
        i++;
    }
    return 1;
}
void queen(int k, int n) {
    int j;
    if (k > n)
        display(n);
    else
        for (j = 1; j <= n; j++) {
            if (place(k, j)) {
                q[k] = j;
                queen(k + 1, n);
            }
        }
}

int main()
{
    int num;
p:    cout << "please input a number:";
    cin >> num;

    if (num > 20) {
        cout << "number过大,不能求解!";
    }
    else {
        cout << num << "皇后的求解如下:" << endl;
        queen(1, num);
        cout << endl;
    }

    goto p;
    return 0;
}

goto语句用于测试。

2 . 运行结果

递归解n皇后