使用全排列的思想解决n皇后问题

78 阅读1分钟

全排列


#include <iostream>
using namespace std;

int k, n;
int queen[1000];
int x[1000];

void show()
{
    for (int i = 1; i <= n; i++)
        cout << queen[i];
    cout << endl;
}

void dfs(int k)
{
    if (k > n)
    {
        show();
        return;
    }
    else
    {
        for (int i = 1; i <= n; i++)
        {
            if (x[i] == 0)
            {
                queen[k] = i;
                x[i] = 1;
                dfs(k + 1);
                x[i] = 0;
            }
        }
    }
}

int main()
{
    cin >> n;
    dfs(1);
}

 

 

N皇后(递归写法)

#include <iostream>
#include <cmath>

using namespace std;
int queen[100];
int n, ans = 0;

//检验第k行的第i列上是否可以摆放皇后
int check(int k, int i)
{
    for (int j = 1; j < k; j++)
    {
        /*
        第一个条件是判断是否在同一列(也可以用visit[i]数组替代);
        第二个条件是判断是否在同一斜线上,依据是计算这两个点之间的水平与垂直距离是否相等;
                abs(queen[j] - i)是计算当前想插入的点与当前正在检查的点之间的水平距离,k-j 是计算二者之间的垂直距离。
        */
        if ((queen[j] == i) || abs(queen[j] - i) == (k - j))
            return 0;
    }
    return 1;
}

void show()
{
    for (int i = 1; i <= n; i++)
    {
        cout << queen[i] << " ";
    }
    cout << endl;
}

void dfs(int k)
{
    int i;
    if (k == n + 1)
    {
        ans++;
        show();
        return;
    }
    for (i = 1; i <= n; i++)
    {
        if (check(k, i)) //也可以在判断条件里加上“visit[i]==0”来检查是否有同意行或列的情况,但这里可以在check函数的for循环里用一个(queen[j] == i)来代替,可以达到同样的效果还减少了visit数组的开辟
        {
            queen[k] = i;
            dfs(k + 1);
        }
    }
}

//使用全排列的思想解决n皇后问题
int main()
{
    cin >> n;
    dfs(1);
    cout << ans;
}

 

另外,非递归写法

void Queen(int n)
{
    int k = 0, j = 0;
    while (k < n)
    {
        while (j < n)
        {
            if (check(k, j))
            {
                queen[k] = j;
                j = 0;
                break;
            }
            else
            {
                j++;
            }
        }
        if (queen[k] == null)
            if (k == 0)
                break;
            else
            {
                k--;
                j = queen[k] + 1;
                queen[k] = null;
                continue;
            }
    }
    if (k == n - 1)
    {
        show();
        j = queen[k] + 1;
        queen[k] = null;
        continue;
    }
    k++;
}
}

 

 

cloud.tencent.com/developer/a…