18
#include<stdio.h>
#include<math.h>

void printboard(int n);
void fourQueen(int k,int n);
int place(int k,int i);
int x[100];

void NQueen(int k,int n)
{
  int i;
  for(i=1;i<=n;i++)
  {
    if(place(k,i)==1)
    {     x[k]=i;
            if(k==n)
            {
                printf("Solution\n");
                printboard(n);
            }
            else
                NQueen(k+1,n);
    }
  }
}

int place(int k,int i)
{
  int j;
  for(j=1;j<k;j++)
  {
    if((x[j]==i)||abs(x[j]-i)==abs(j-k))
        return 0;
  }
  return 1;
}

void printboard(int n)
{
  int i;
  for(i=1;i<=n;i++)
    printf("%d  ",x[i]);
}

void main()
{
    int n;
    printf("Enter Value of N:");
    scanf("%d",&n);
    NQueen(1,n);
}

我认为它具有时间复杂度:O(n^n),因为 NQueen 函数正在递归调用,但是这个程序是否有更严格的界限?最好的情况和最坏的情况时间复杂度怎么样。我也对 O(k) 和从 NQueen() 调用的 place() 函数感到困惑。

4

6 回答 6

14

有很多优化可以提高算法的时间复杂度。

这些链接中有更多信息:

  1. https://sites.google.com/site/nqueensolver/home/algorithm-results

  2. https://sites.google.com/site/nqueensolver/home/algorithms/2backtracking-algorithm

快照

于 2014-01-11T06:44:54.237 回答
12

对于您的函数T(n) = n*T(n-1) + O(n^2) ,它大约转换为O(N!)时间复杂度。

于 2014-01-11T07:06:01.797 回答
8

N-QUEEN 问题的时间复杂度是

> O(N!)

解释:如果我们将所有这些加起来并将运行时间定义为 T(N)。那么 T(N) = O(N2) + N*T(N-1)。如果您使用此递归绘制递归树,则最终项将类似于 n3+ n!O(1)。根据 Big O 的定义,这可以减少到 O(n!) 的运行时间。

于 2017-12-16T05:20:02.727 回答
7

O(n^n) 绝对是使用回溯求解 n-queens 的上限。我假设您正在通过分配一个queen column-wise来解决这个问题。但是,请考虑这一点 - 当您在第一列中分配女王的位置时,您有 n 个选项,之后,您只有 n-1 个选项,因为您不能将女王与第一个女王放在同一行,然后是 n-2 等等。因此,最坏情况的复杂度仍然是 O(n!) 的上限。

希望这能回答你的问题,即使我迟到了将近 4 年!

于 2017-12-03T04:59:50.797 回答
2

复杂度是 n^n,这里是解释

这里 n 代表皇后的数量,并且对于每个函数调用都将保持不变。K 是行号,函数将被调用次数,直到 k 达到 n。如果 n=8,我们有 n 行和 n 个皇后。

T(n)=n(n+t(max of k - 1))=n^max of k=n^n 因为 k 的最大值是 n。

注意:该函数有两个参数。在循环中,n 不是递减的,对于每个函数调用它都保持不变。但是对于函数调用的次数,它是递减的,因此递归可以终止。

于 2014-11-02T10:30:09.187 回答
2

让我们考虑一下我们的女王是一个,这意味着我们不需要处理对角线冲突。

在这种情况下,时间复杂度将是O(N!)最坏的情况,假设我们正在寻找是否存在任何解决方案。这是一个简单的解释。

让我们举一个 N=4 的例子。

假设我们要填充二维矩阵。X代表一个空缺职位,而1代表一个被占用的职位。

一开始,答案矩阵(我们需要填充)看起来像,

X X X X
X X X X
X X X X
X X X X

让我们逐行填充,意思是在每一行中选择一个位置,然后前进到下一行。

对于第一行,由于整个矩阵都没有填充,所以我们有4 options. 对于第二排,我们3 options已经取消了一排。同样,对于第三行,我们有2 options,对于最后一行,我们只剩下1 option.

总选项 =4*3*2*1 = 24 (4!)

现在,如果我们的女王是车,情况就是这样,但是因为我们在女王的情况下有更多的限制。复杂性应小于O(N!)实际操作数。

于 2019-07-09T19:47:04.643 回答