来自二维阵列的所有可能路径? (交叉产品)

时间:2019-12-07 17:40:57

标签: c arrays multidimensional-array cycle

假设我有这个数组

int diml = 3;
int dims = 3;
int time [diml][dims] ={
  (10, 3, 5),
  ( 4, 7, 2),
  ( 2, 8, 1)
};


如何获得类似的每种组合

(10, 3, 5)
(10, 3, 2)
(10, 3, 1)
(10, 7, 5)
(10, 7, 2)
(10, 7, 1)
...
(2, 8, 5)
(2, 8, 2)
(2, 8, 1)

*是否可以在不将所有组合保存到新数组中的情况下实现,而只是将一维本地数组存储在每个循环中的当前组合?

*我更喜欢循环而不是递归。在每个循环的最后,我需要模式(例如10、3、2),以便我可以对其进行详细说明。

* 2D阵列的尺寸为MxN(3x3仅是示例)。

*接受具有二叉树的解决方案(但我也想保存索引)。

我应该在C中执行此操作。我在StackOverflow中找到了类似的解决方案,但是它们按列工作,并且将数据保存在2D数组中,但这不是我所需要的。

提前谢谢! (:

1 个答案:

答案 0 :(得分:0)

对于此示例代码,构建了第一个示例代码,因此更易于理解示例2。示例1仅针对3x3矩阵构建。构建示例2,使其可以容纳最多8列的矩阵。我没有使用malloc或返回一个数组。它将为您打印所有可能的组合。它不涉及返回数据,但将其合并到代码中并不难。

对于所有可能组合的计算方法,我将以3x3矩阵为例。

在3x3矩阵中,有3行3列。我将每一列视为可以选择的一组数字,并将行作为可以选择的可能的数字。因此,在该示例中,我可以为第一,第二和第三组数字选择012。

所以要获得所有可能的组合,我有3个数组,[0] [1] [2]。它们都从0开始。我先保存0 0 0的可能组合。然后将数组2加1。然后得到0 01。然后保存该组合。我将继续这样做,然后将[2]数组== 2继续。我将其设为0,并向其左侧的数组添加1。因此它变为0 10。当我到达一个数组的值为0 2 2的循环时,此后的循环将得到1 00。我将继续这样做,直到所有值都变为零为止,然后我完成了。

关于数据的存储方式,我将它们连续存储在数组中。正确读回该值。以2x5矩阵为例。每个组合将有5个数字。因此,第一个组合是前五个索引,下一个组合是在该索引之后的下五个数字。

要计算在计算组合之前需要多少数组长度,您可以将计算基于行和列。将此视为彩票。如果有3列,则可以选择3个数字。每列都有3行,这意味着每次您选择一个数字时,都有3种可能的数字可供选择。对于您来说,赢得大奖的机会是1:3 x 1:3 x 1:3或1:27,因为如果选择3个这样的数字(123 123 123)并以正确的顺序进行匹配,则有27种可能性。因此,对于3x3矩阵,它是3x3x3、4x4 = 4x4x4x4、1x3 = 1、3x1 = 3、2x5 = 2x2x2x2x2 = 32。

因此,可能的组合数量是“行数”对“列数”的幂。

大小是可能组合的数量乘以每个组合的数字数量。其中是“可能性乘以列数=所需的数组大小。

示例1:

#include <stdio.h>
void printMatrixCombo(int row, int col, int matrix[row][col]);

int main(){
  const int m1 = 3;
  const int m2 = 3;

  int matrix[m1][m2] = { 
   {10, 3, 5},
   {4, 7, 2},
   {2, 8, 1}
  };

  printMatrixCombo(m1, m2, matrix);
  return 0;
}

// Only use this for a 3x3
void printMatrixCombo(int row, int col, int matrix[row][col]){
  int oi = 0;
  int output[81] = {0};

  for (int group1 = 0; group1 < 3; group1++){
    for (int group2 = 0; group2 < 3; group2++ ){
      for (int group3 = 0; group3 < 3; group3++ ){
        output[oi++] = matrix[group1][0];
        output[oi++] = matrix[group2][1];
        output[oi++] = matrix[group3][2];
      }
    }
  }

  printf("There were %d combination in the matrix of %d x %d\n", oi / col, row, col );

  for ( int i = 0; i < oi ; ){
    printf("(");
    for ( int j = 0; j < col; j++ ){
      printf("%d", output[i+j]);
      if ( j != col - 1 ) printf(", ");
    }
    printf(")\n");
    i = i + col;
  }
}

示例2:

#include <stdio.h>
void printMatrixCombo(int row, int col, int matrix[row][col]);

int main(){
  const int row = 4;
  const int col = 4;

  /*// 3x3
  int matrix[row][col] = { 
   {10, 3, 5},
   {4, 7, 2},
   {2, 8, 1}
  };//*/

  // 4 x 4
  int matrix[row][col] = { 
   {10, 3, 5, 7},
   {4, 7, 2, 3},
   {2, 8, 1, 9},
   {9, 4, 8, 11}
  };//*/

  /*// 5 x 5 
  int matrix[row][col] = { 
   {10, 3, 5, 7, 25},
   {4, 7, 2, 87, 42},
   {2, 8, 1, 85, 39},
   {9, 4, 8, 94, 57},
   {10, 3, 5, 7, 93},
  };//*/


  /*// 2 x 2 
  int matrix[row][col] = { 
    {10, 3},
    {4, 7},
  };//*/

  /*// 1 x 1 
  int matrix[row][col] = { 
    {10},
  };//*/

  /* // 3 x 1 
  int matrix[row][col] = { 
    {10},
    {4},
    {1}
  }; //*/

  /*// 1 x 3 
  int matrix[row][col] = { 
    {10, 4, 1},
  };// */

  printMatrixCombo(row, col, matrix);
  return 0;
}

void printMatrixCombo(int row, int col, int matrix[row][col]){
  int oi = 0;
  int allZ = 0;
  // This is the maximum for a 5x5
  // Change to fit usage case
  int output[15625] = {0};

  int colCount[8] = {0};
  int lastCol = col - 1;
  int lastRow = row - 1;

  while (1){
    for ( int i = 0; i < col; i++ )
      output[oi++] = matrix[colCount[i]][i];

    if ( colCount[lastCol] == lastRow ){
      colCount[lastCol] = 0;
      for (int i = lastCol - 1; i > -1; i--){
        if ( colCount[i] == lastRow ){
          colCount[i] = 0;
        } else {
          colCount[i]++;
          break;
        }
      }
    } else {
      colCount[lastCol]++;
    }

    allZ = 1;
    for ( int i = 0; i < col; i++ ){
      if ( colCount[i] != 0 ){
        allZ = 0;
        break;
      }
    }

    if (allZ == 1) break;
  }  

  printf("There were %d combination in the matrix of %d x %d\n", oi / col, row, col );
  printf("Array's length(indexes) is %d\n", oi );

  for ( int i = 0; i < oi ; ){
    printf("(");
    for ( int j = 0; j < col; j++ ){
      printf("%d", output[i+j]);
      if ( j != col - 1 ) printf(", ");
    }
    printf(")\n");
    i = i + col;
  }
}