增量数字更改循环? (所有排列)

时间:2015-04-15 03:06:31

标签: c++ arrays

我有一个数组,我需要在给定以下约束的情况下对此数组进行所有可能的排列:

可能的值为:0.25,0.5,0.75,1.0,1.25,1.5,1.75,2.0。

该数组有18个元素。每个元素可以包含上述值之一。允许重复,例如:0.25,0.25,0.5等...

我需要采用什么类型的迭代来覆盖每个排列(而不是组合)?

for(...)
{
   std::vector<float> array;

   for(...)
   array.push_back...
}

etc

我的问题并不是要找到给定数组的所有排列:

我只想:

for example:
0.25 0.25 0.25
0.5 0.25 0.25
1.0 0.25 0.25
...
All the way to 
2.0 2.0 2.0

1 个答案:

答案 0 :(得分:0)

这是一个程序,它会将所有这些组合(厌倦,加载它们)打印到名为combinations.txt的文件中。但请注意,它需要一段时间,输出将是巨大的,因为有很多这些组合。至于它是如何工作的,它是一个快速而肮脏的解决方案,其中我有一个包含18个元素的int数组。我使用了int,因为它更容易在整数运算中工作,但是输出通过除以100转换为所需的格式。现在,应用程序在文件中打印出每个组合,然后递增第一个如果元素超过200(或者你为2.00),它将该元素设置为25,并将数组中的下一个元素递增25。它就像计数一样,当你达到9时,第一个数字包裹并为下一个更高的功率添加一个。

#include <cstdio>
#include <cmath>

FILE *pOut;

void PrintCombinationToFile ( int *pArray )
{
    fprintf ( pOut,  "\n" );
    for ( unsigned i = 0; i < 18; i++ )
        fprintf ( pOut, "%.2f ", pArray[i] * 1.0 / 100.0 );
}


int IncrementArray ( int *pArray )
{
    unsigned i = 0;
    pArray[0] += 25;
    while ( pArray[i] > 200 )
    {
        if ( i == 18 )
            return 0;
        pArray[i] = 25;
        pArray[i+1] += 25;
        i++;
    }
    return 1;
}

int main()
{
    int initialArray[18];
    int i;

    pOut = fopen ( "combinations.txt", "w" );
    if ( !pOut )
    {
        printf ( "\nUnable to open a new file." );
        return 1;
    }

    for ( i = 0; i < 18; i++ )
        initialArray[i] = 25;

    PrintCombinationToFile(initialArray);

    while(IncrementArray(initialArray))
        PrintCombinationToFile(initialArray);

    fflush ( pOut );
    fclose ( pOut );
    printf ( "Done!")
    return 0;
}