#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函数是递归调用的,但这个程序是否有更紧密的约束?那么最好的情况,最坏的情况时间复杂性。我也对place()函数感到困惑,它是O(k)并从NQueen()调用。
答案 0 :(得分:10)
有许多优化可以提高算法的时间复杂度。
这些链接中有更多信息:
答案 1 :(得分:9)
对于您的函数T(n) = n*T(n-1) + O(n^2)
,其平均时间复杂度为O(N!)
。
答案 2 :(得分:6)
N-QUEEN问题的时间复杂性
<强>&GT; O(N!)强>
说明: 如果我们将所有这些添加起来并将运行时间定义为T(N)。然后T(N)= O(N2)+ N * T(N-1)。如果使用此重复绘制递归树,则最终项将类似于n3 + n!O(1)。通过Big O的定义,这可以减少到O(n!)运行时间。
答案 3 :(得分:2)
复杂性是n ^ n,这是解释
这里n表示皇后的数量,并且对于每个函数调用将保持相同。 K是行号,函数将被调用次数,直到k到达n。如果n = 8,我们有n行和n个皇后。
T(n)= n(n + t(k = 1的最大值))= n ^ k,k = n ^ n,因为k的最大值是n。
注意:该函数有两个参数。在循环中,n没有减少,对于每个函数调用它都保持相同。但是对于调用函数的次数,它正在减少,以便递归可以终止。
答案 4 :(得分:1)
O(n ^ n)绝对是使用回溯解决n-queens的上限。 我假设您通过分配女王column-wise来解决这个问题。 但是,考虑到这一点 - 当您在第一列中指定女王的位置时,您有n个选项,之后,您只有n-1个选项,因为您可以将女王放在与第一列相同的行中女王,然后是n-2等等。因此,最坏情况的复杂性仍然受到O(n!)的限制。
希望这可以回答你的问题,即使我已经差不多4年了!
答案 5 :(得分:0)
让我们认为我们的女王是个白痴,这意味着我们无需处理对角线冲突。
在最坏的情况下,这种情况下的时间复杂度将为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!)
。