假设我有这个数组
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数组中,但这不是我所需要的。
提前谢谢! (:
答案 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。
因此,可能的组合数量是“行数”对“列数”的幂。
大小是可能组合的数量乘以每个组合的数字数量。其中是“可能性乘以列数=所需的数组大小。
#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;
}
}
#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;
}
}