繰り返し番号を含む5つのグループで、番号のセットのすべての順列を一覧表示するC関数を作成しようとしています。
15-11-49-43-5
2-30-34-6-11
したがって、数値セットのすべての順列を取得してそれらを破棄する関数を作成するのは簡単ですが、特定のグループサイズにマップされているため、やや行き詰まっています。
繰り返し番号を含む5つのグループで、番号のセットのすべての順列を一覧表示するC関数を作成しようとしています。
15-11-49-43-5
2-30-34-6-11
したがって、数値セットのすべての順列を取得してそれらを破棄する関数を作成するのは簡単ですが、特定のグループサイズにマップされているため、やや行き詰まっています。
void visit(int *Value, int N, int k)
{
static level = -1;
level = level+1; Value[k] = level;
if (level == N)
print(Value, N);
else
for (int i = 0; i < N; i++)
if (Value[i] == 0)
visit(Value, N, i);
level = level-1; Value[k] = 0;
}
詳細については、http://www.bearcave.com/random_hacks/permute.htmlをご覧ください。
次のような特定の順列を取得しますか?
必要な数値 (マイナス 1) を基数 49 に変換し、結果に「数字」 (プラス 1) を使用します。
42000000 - 1 = 41999999 41999999 = (7 * 49^4) + (13 * 49^3) + (48 * 49^2) + (34 * 49) + 41 結果 8 14 49 35 42
これを2つの問題に分割します。a)サイズnbの配列のすべての組み合わせnCkを検索します。)長さkの配列のすべての順列を検索します。あなたはすでに順列を行う方法を知っていると言ったので、組み合わせに焦点を当てましょう:
void combinations(int *arr, int *comb, int n, int k, int kCurr)
{
if(kCurr >= k)
{
permutations(comb, k);
return;
}
int i;
for(i=0; i<n; ++i)
{
comb[kCurr] = arr[i];
combinations(arr+i, comb, n-i, k, kCurr+1);
}
}
これは次のように呼ばれます:
int myArray[49] = {1, 2, ..., 49};
int myCombs[5];
combinations(myArray, myCombs, 49, 5, 0);
これは、配列を構築することによって49C5のすべての組み合わせを計算し、配列myCombs
がいっぱいになると関数を呼び出しますpermutations
。が適切に実装されている場合permutations
は、49C5のすべての組み合わせのすべての順列を出力します。
編集:ええと、combinations(arr, comb, n, k kCurr+1)
再帰的な手順として実行してから、配列をベースケースに出力する(または何でもする)ことができます。
繰り返しが許可されており、出力セットは入力セットよりも小さいため、実際には順列ではありません。
あなたは単純な数を探しているだけです:
for (a[0] = 1; a[0] <= 49; a[0]++)
for (a[1] = 1; a[1] <= 49; a[1]++)
for (a[2] = 1; a[2] <= 49; a[2]++)
for (a[3] = 1; a[3] <= 49; a[3]++)
for (a[4] = 1; a[4] <= 49; a[4]++)
printf("%d-%d-%d-%d-%d\n", a[0], a[1], a[2], a[3], a[4]);
サイズ 5 のすべての組み合わせではなく、すべての順列を見つける方法を知っている場合は、次のすべての順列を見つけるだけです。
int A[49] = { 0, 0, ..., 0, 1, 1, 1, 1, 1};
配列 A の各順列は、[0, 49) の各 i について、A[i] == 1 の場合にのみ、番号 (i+1) を含む組み合わせに対応します。