我需要一个包含N个元素的所有排列的矩阵。实际上,它的尺寸将是N x N!该矩阵的一个特殊属性是每个子矩阵的维数为K x K! (K 为了澄清这个问题,这里是生成矩阵的形式。第二列以一个“2”开头,第三列以两个“3”开头,第i列以(i-1)开头!元素“我”。对排列的排序没有其他要求,只需简化算法即可。1 2 3 4 5 ...
2 1 3 4 5 ...
* * * 4 5 ...
* * * 4 5 ...
* * * 4 5 ...
* * * 4 5 ...
* * * * 5 ...
...
答案 0 :(得分:1)
我希望我理解这个问题;-) - 解决方案是基于KxK的观察!锚定在[1,1]的子矩阵可以通过以下方式扩展:a)向K添加K + 1!行,b)复制第一个K的行向量!行重复,即K次,进入行K + 1 ..(K + 1)!,同时替换每组K!将值1..K按K + 1行并将K存储到K + 1列中。
#include <stdio.h>
#define N 6
#define NF (1*2*3*4*5*6)
int p[NF][N];
int main( int argc, char* args[] ){
int n, i, k, iCol, iRow;
int row = 0;
for( n = 0; n < N; n++ ){
if( n == 0 ){
p[row][n] = n+1;
row++;
} else {
// add new value n+1 to all existing rows
for( i = 0; i < row; i++ ){
p[i][n] = n+1;
}
// for all numbers 1..n
int nextRow = row;
for( k = 1; k <= n; k++ ){
// pass through all rows so far
for( iRow = 0; iRow < row; iRow++ ){
// copy row
for( iCol = 0; iCol < n; iCol++ ){
int h = p[iRow][iCol];
p[nextRow][iCol] = h == k ? n+1 : h;
}
p[nextRow][n] = k;
nextRow++;
}
}
row = nextRow;
}
}
for( iRow = 0; iRow < NF; iRow++ ){
for( iCol = 0; iCol < N; iCol++ ){
printf( "%3d", p[iRow][iCol] );
}
printf( "\n" );
}
}
答案 1 :(得分:0)
以下是使用问题Improving the time complexity of all permutations of a given string
中的算法的工作程序#include <stdio.h>
#define N 6
#define NF (1*2*3*4*5*6)
int p[NF][N];
void swap (int *a, int i, int j)
{
int tmp;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void permute(int *a, int i, int n)
{
int j;
static int k=0;
if (i == n) {
for (j=0; j<N; j++) p[k][j] = a[N-j-1];
k++;
}
else for (j=i; j<=n; j++) {
swap(a,i,j);
permute(a,i+1,n);
swap(a,i,j);
}
}
int main() {
int i,j,a[N];
for (i=0; i<N; i++) a[i] = N-i;
permute(&a,0,N-1);
for(i=0;i<NF;i++) {
for(j=0;j<N;j++) {
printf("%3d",p[i][j]);
}
printf("\n");
}
}