26 文字 (26*25*24=15,600 になります) を使用して、可能なすべての 3 文字順列を計算しようとしています。文字の順序は重要であり、文字を繰り返したくありません。(順列を辞書順に生成したかったのですが、それは必須ではありません)
for
これまでループをネストしようとしましたが、可能なすべての組み合わせを反復することになりました。そのため、繰り返し文字がありますが、これは望ましくありません。またfor
、3 文字以上が必要な場合、ループの管理が難しくなる可能性があります。
使用されていない文字が得られるまで文字をめくることはできますが、辞書順ではなく、使用するよりもはるかに遅くなりますnext_permutation
(このstd
方法は使用できません。 26文字)。
これを行うより効率的な方法はありますか?非効率性をnext_permutation
考慮して、最初の 6 桁を瞬時に反復します。ただし、この方法を使用して 3 文字の順列をすべて取得するには数秒かかり、next_permutation
計算しなければならない 2^n サブセットを使用するとすぐに非効率になります。
ネストされたfor
ループについて私が持っているものは次のとおりです。
char key[] = {'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','r','s','t','u','v','w','x','y','z'};
bool used[25];
ZeroMemory( used, sizeof(bool)*25 );
for( int i = 0; i < 25; i++ )
{
while( used[i] == true )
i++;
if( i >= 25 )
break;
used[i] = true;
for( int j = 0; j < 25; j++ )
{
while( used[j] == true )
j++;
if( j >= 25 )
break;
used[j] = true;
for( int k = 0; k < 25; k++ )
{
while( used[k] == true )
k++;
if( k >= 25 )
break;
used[k] = true;
cout << key[i] << key[j] << key[k] << endl;
used[k] = false;
}
used[j] = false;
}
used[i] = false;
}