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