在 6楼 代码的基础上改善了一下。(6楼代码不好的地方在于,可能先筛选出k比较小的排列,后面需要舍弃)
 程序代码:
程序代码:
输出结果
	
	
	       程序代码:
程序代码:#include <stdio.h>
size_t foo( const int a[static 21] )
{
    size_t k_max=0, k=21;
    for( unsigned m=0; m!=(1u<<20)-1; )
    {
        _Bool bok = 1;
        for( unsigned i=0; bok && i!=21; ++i )
            if( (~m)&(1u<<i) )
                for( unsigned j=i+1; bok && j!=21; ++j )
                    if( (~m)&(1u<<j) )
                        bok = a[j-i]==a[0];
        if( bok && k_max==0 )
            k_max = k;
        if( bok && k==k_max )
        {
            for( unsigned i=0; i!=21; ++i )
                if( (~m)&(1u<<(21-1-i)) )
                    printf( "%u, ", i );
            printf( "k=%zu\n", k_max );
        }
        // next m
        unsigned r = m==0 ? 1 : (((m|(m-1))+1)|((m^((m|(m-1))+1))/((m^(m-1))+1)/2)) & ((1u<<20)-1);
        if( r<m && k_max!=0 )
            break;
        if( m==0 || r<m )
            --k;
        m = r<m ? ((r<<2)|3) & ((1u<<20)-1) : r;
    }
    return k_max;
}
int main( void )
{
    const int a[21] = { 10, 10, 10, 45, 87, 66, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 85, 47, 15, 10, 10 };
    foo( a );
}输出结果
0, 1, 2, 8, 9, 10, k=6
0, 1, 2, 8, 9, 15, k=6
0, 1, 2, 8, 14, 15, k=6
0, 1, 2, 9, 10, 11, k=6
0, 1, 2, 10, 11, 12, k=6
0, 1, 2, 11, 12, 13, k=6
0, 1, 2, 12, 13, 14, k=6
0, 1, 2, 13, 14, 15, k=6
0, 1, 7, 8, 9, 15, k=6
0, 1, 7, 8, 9, 20, k=6
0, 1, 7, 8, 14, 15, k=6
0, 1, 7, 8, 14, 20, k=6
0, 1, 7, 13, 14, 15, k=6
0, 1, 7, 13, 14, 20, k=6
0, 1, 8, 9, 10, 20, k=6
0, 1, 9, 10, 11, 20, k=6
0, 1, 10, 11, 12, 20, k=6
0, 1, 11, 12, 13, 20, k=6
0, 1, 12, 13, 14, 20, k=6
0, 6, 7, 8, 14, 15, k=6
0, 6, 7, 8, 14, 20, k=6
0, 6, 7, 8, 19, 20, k=6
0, 6, 7, 13, 14, 15, k=6
0, 6, 7, 13, 14, 20, k=6
0, 6, 7, 13, 19, 20, k=6
0, 6, 12, 13, 14, 20, k=6
0, 6, 12, 13, 19, 20, k=6
0, 7, 8, 9, 19, 20, k=6
0, 8, 9, 10, 19, 20, k=6
0, 9, 10, 11, 19, 20, k=6
0, 10, 11, 12, 19, 20, k=6
0, 11, 12, 13, 19, 20, k=6
0, 1, 2, 8, 9, 15, k=6
0, 1, 2, 8, 14, 15, k=6
0, 1, 2, 9, 10, 11, k=6
0, 1, 2, 10, 11, 12, k=6
0, 1, 2, 11, 12, 13, k=6
0, 1, 2, 12, 13, 14, k=6
0, 1, 2, 13, 14, 15, k=6
0, 1, 7, 8, 9, 15, k=6
0, 1, 7, 8, 9, 20, k=6
0, 1, 7, 8, 14, 15, k=6
0, 1, 7, 8, 14, 20, k=6
0, 1, 7, 13, 14, 15, k=6
0, 1, 7, 13, 14, 20, k=6
0, 1, 8, 9, 10, 20, k=6
0, 1, 9, 10, 11, 20, k=6
0, 1, 10, 11, 12, 20, k=6
0, 1, 11, 12, 13, 20, k=6
0, 1, 12, 13, 14, 20, k=6
0, 6, 7, 8, 14, 15, k=6
0, 6, 7, 8, 14, 20, k=6
0, 6, 7, 8, 19, 20, k=6
0, 6, 7, 13, 14, 15, k=6
0, 6, 7, 13, 14, 20, k=6
0, 6, 7, 13, 19, 20, k=6
0, 6, 12, 13, 14, 20, k=6
0, 6, 12, 13, 19, 20, k=6
0, 7, 8, 9, 19, 20, k=6
0, 8, 9, 10, 19, 20, k=6
0, 9, 10, 11, 19, 20, k=6
0, 10, 11, 12, 19, 20, k=6
0, 11, 12, 13, 19, 20, k=6
[此贴子已经被作者于2020-10-11 10:06编辑过]

 
											





 
	    
