tion, hold, k);
Lad[k][position[k][i-1]-1]=i; //填充i
hold[k][position[k][i-1]-1]=1;
if (k!=N-1) //还未将i填充完毕
{
k++; //继续试探下一行
continue;
}
else
{
return (1); //i已填好,填充成功,返回1
}
}
}
}
}
int find(int i, int position[][N], int hold[][N], int k)
{
int j=position[k][i-1];
for (j++; j<=N; j++) //搜索k+1行下一个可以填充i的位置
if (place(i, j, position, hold, k)==1)
return (j); //找到返回该位置的列标
}
return (0); //没有下一个可以填充i的位置,返回0
}
int place(int i, int j, int position[][N], int hold[][N], int k)
{
int m, flag=0;
for (m=0; m<k; m++) //检查k+1行以上各行的i是否都和k+1行j列不在同一列
{
if (position[m][i-1]==j)
flag=1; //有i在同一列,k+1行j列位置不合法
}
if (hold[k][j-1]==1) //k+1行j列已被填充,位置不合法
flag=1;
if (flag==1)
return (0); //位置不合法
else
return (1); //位置合法
}
void L(int **p1, int *p2, int n) //将p2指向的数组中的n个数的所有全排列存放在p1所指向的二维数组中
{
if (n==1)
*p1[0]=*p2;
else
{
int **p3;
int *p4;
int c, d, f, k, m, i, j;
d=n-1;
c=B(d);
p4=(int *) malloc(d*sizeof(int));
p3=(int **) malloc(c*sizeof(int *));
for (i=0; i<c; i++)
p3[i]=(int *) malloc(d*sizeof(int));
j=0; f=c;
for (i=0; i<n; i++)
{
m=0;
for (k=0; k<n; k++)
{
if (k==i)
continue;
*(p4+m)=*(p2+k);
m++;
}
L(p3, p4, d);
for (k=0; k<c; k++)
for (m=0; m<d; m++)
*(p1[k+j]+m+1)=*(p3[k]+m);
while (j<f)
{