在C-最优图着色中生成所有可能的数组组合

在C-最优图着色中生成所有可能的数组组合,c,combinatorics,C,Combinatorics,我需要用所有可能的组合生成数组,就像我在这里发现的这个问题: 我正在做一个简单的优化图着色工作,因此,我试图生成所有可能的颜色组合(数组表示每个节点的颜色)。此代码正在工作,但也在做不必要的工作在这种情况下,[1,1,2]与[2,2,1]是一样的,我不需要再次测试这是否是一个有效的图 我想不出什么,但首先我想知道是否有一个简单的代码来完成我想做的事情 现在,我的代码是这样的: void generatearray(int array[], int array_size, int idx){

我需要用所有可能的组合生成数组,就像我在这里发现的这个问题:

我正在做一个简单的优化图着色工作,因此,我试图生成所有可能的颜色组合(数组表示每个节点的颜色)。此代码正在工作,但也在做不必要的工作在这种情况下,[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);
    }

}
试试这个:

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 generatarray(int数组[],int数组大小,int idx=0,int fixed=0)
{
int i;
if(idx==数组大小)
{
putchar('\n');
对于(i=0;i
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 generatarray(int数组[],int数组大小,int idx=0,int fixed=0)
{
int i;
if(idx==数组大小)
{
putchar('\n');
对于(i=0;i对于(i=0;我想我不明白。
[1,1,2]
[2,2,1]
是怎么回事?[1,1,2]和[2,2,1]是一样的,因为数字的值并不重要,只是它们是不同的。例如,[1,1,2]和[400400,3]或[0,0,9]是一样的。所以
[3,3,3]
[0,0,0]是一样的
不应该出现在你的输出中吗?正如
[3,3,2]
[3,3,1]
[1,1,2]
[2,2,1]
一样。我怀疑在给定的示例中没有任何颜色(
0
)与任何颜色(
1
-
3
)相同。因此,
[0,1]
[0,0,2]
[0,0,3]
的安排列表非常短。特别是如果
[0,1,0]
也与
[0,0,1]相同,那么
[1,0,0]
相同(我们现在知道
[1,0,0]
[0,1,1]
相同,而且
[1,2]
[2,3,3]
[3,2,2]
。换句话说,在这种情况下,排序是否重要?我想我不明白。
[1,1,2]
[2,2,1]
如何相同?[1,1,2]与[2,2,1]相同,因为数字的值并不重要,只是它们不同而已。因此,[1,1,2]与[400400,3]也是一样的例如,
[3,3,3]
[0,0,0]
相同,不应该出现在您的输出中?正如
[3,3,2]
[3,3,1]
相同
[1,1,2]
[2,2,1]
一样。我怀疑没有任何颜色(
0
)与任何颜色相同(
1
-
3
)在给定的示例中。就这一点而言,
[0,0,1]
[0,0,2]
相同,
[0,0,3]
使得安排列表非常短。特别是如果
[0,1,0]
[0,0,1]
相同,那么
[1,0,0]
相同(我们现在知道
[1,0,0]
[0,1,1]
[1,2,2]
[2,3,3]
[3,2,2]
。换句话说,在这种情况下排序是否重要?哦,谢谢!但实际上,这对我的代码有点帮助,但并不能解决我的问题。它只是在第一个数组位置使用固定颜色,但仍在生成,例如,[0,3,3]和[0,2,2]以及[0,1,1],这是一样的。现在,这正是我想要的,谢谢!这减少了我代码执行时间的10倍。你帮了我很多忙!哦,谢谢!但实际上,这对我的代码有一点帮助,但并不能解决我的问题。它只是在第一个数组位置使用固定的颜色,但仍在生成,例如,[0,3,3]和[0,2,2]和[0,1,1]是一样的。现在,这正是我想要的,谢谢!这将我的代码执行时间减少了10倍。你帮了我很多忙!
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);
       }

   }
}