排列的矩阵和子矩阵

时间:2014-01-09 09:27:38

标签: c algorithm matrix permutation

我需要一个包含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 ...
...

2 个答案:

答案 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");
  }
}