在C中生成所有可能的数组组合 – 最佳图形着色

我需要生成具有所有可能组合的数组,就像我在这里找到的这个问题:

组合:生成所有“状态” – 数组组合

我正在做一个简单的最佳图形着色工作 ,所以,我正在尝试生成所有可能的颜色组合(数组代表每个节点的颜色)。 这段代码正在运行,但也在做不必要的工作。 在这种情况下,[1,1,2]与[2,2,1]相同,我不需要再测试这是否是有效图形

我想不出什么,但首先我想知道是否有一个简单的代码来做我想做的事情。

现在,我的代码是这样的:

void generatearray(int array[], int array_size, int idx){ int i; if(idx == array_size){ putchar('\n'); for(i = 0; i < array_size; i++) printf("%i ", array[i]); } else for(i = 0; i <= 3; i++){ array[idx] = i; generatearray(array, array_size, idx+1); } } 

它将打印:

  [0, 0, 0] [0, 0, 1] [0, 0, 2] [0, 0, 3] [0, 1, 0] [0, 1, 1] ... [3, 3, 0] [3, 3, 1] [3, 3, 2] [3, 3, 3] 

试试这个:

 void generatearray( int array[], int array_size, int idx = 0, int fixed = 0 ) { int i; if ( idx == array_size ) { putchar('\n'); for( i = 0; i < array_size; i++ ) printf( "%i ", array[i] ); } else { for( i = 0; i <= 3; i++ ) { if ( fixed == i ) { fixed++; array[idx] = i; return generatearray( array, array_size, idx + 1, fixed ); } array[idx] = i; generatearray( array, array_size, idx + 1, fixed ); } } } int arr[6]; generatearray( arr, 6 ); 

老破的答案:

 void generatearray(int array[], int array_size, int idx){ int i; if(idx == array_size){ putchar('\n'); for(i = 0; i < array_size; i++) printf("%i ", array[i]); } else if ( idx == 0 ) { array[idx] = 0; generatearray(array, array_size, idx+1); } else { for(i = 0; i <= 3; i++){ array[idx] = i; generatearray(array, array_size, idx+1); } } }