我有一些理解回溯的问题。我需要计算使用数组可以生成多少可能的排列,并记住一些约束
我的阵列代表一组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;
}