C回溯,阵列排列

时间:2018-05-15 14:38:02

标签: c


我有一些理解回溯的问题。我需要计算使用数组可以生成多少可能的排列,并记住一些约束 我的阵列代表一组LED灯,每个灯都有一个颜色,一个名字和一个强度 不能有两个相同颜色的灯彼此相邻,两个相邻LED之间的强度差异不应大于'K'。 我写了代码,但似乎有些东西。它有太多的排列,因为有些灯正在重复,即使我实施了限制。

int verification ( led*  sol , int  a  , int  b )
{
    if( sol[a].intensity > sol[b].intensity ) 
        return  sol[ a ].intensity - sol[ b ].intensity;
    else 
        return  sol[ b ].intensity - sol[ a ].intensity;
}
int is_valid( led*  sol , int  n , int  level , int  K )
{
    int i;
    for( i = 0 ; i < level-1 ; i++ )
    {
        if( strcmp( sol[ i ].color, sol[ i+1].color ) ==0 || verification(sol , i , i+1) > K )
            return 0;
                if( strcmp( sol[ i ].name , sol[ i+1 ].name ) ==0 )
                        return 0;
            }
    return 1;
}
int is_solultion ( led*  sol , int  n , int  level , int  K )
{
        int i;
    if( n == level &&  is_valid ( sol , n , level , K ) )
                    return 1;
    else
        return 0;
}
int  backtracking ( led*  sol , int  n , led*  l , int  level , int  K )
{
    int  i;
    int  sum =0;
    if( n == level &&  ! (is_solution ( sol , n , level , K ) ) ) 
        return 0;
    if( is_solution ( sol , n , level , K ) )
        return 1;
    for( i = 0 ; i < n ; i++ )
    {
        sol[ level ] = l [ i ] ;
        if ( este_valid ( sol , n , level+1, K ) )
            sum + = backtracking ( sol , n , l , nivel+1 , K );
    }  return sum;
}

0 个答案:

没有答案