1

プレイヤーの配列があります

$players = array('A','B','C','D','E','F');

そして、可能な限りすべての 3 方向の仕上げを取得したいと考えています。

1st 2nd 3rd
A   B   C
A   B   D
...
C   A   B
C   B   A
...
F   D   E
F   E   D

私はいくつかの順列アルゴリズムを持っていますが、順列には6 * 5 * 4 * 3 * 2 * 1の組み合わせがあり、ここでは6 * 5 * 4しかないので、それは何か別のものでなければなりません

4

4 に答える 4

2

繰り返しなしで 6 つの組み合わせのうち 3 つを出力する擬似コードを次に示します。

for i = 1 to 6
  for j = 1 to 6
    if (j != i)
      for k = 1 to 6
        if (k != i && k != j)
          print(A[i], A[j], A[k])
        end if
      next k
    end if
  next j
next i

一般的な k-of-n ケースについては、次を参照してください: n から k 要素のすべての組み合わせを返すアルゴリズム

于 2012-07-04T14:08:45.767 に答える
1

順列アルゴリズムを指定すると、2つのステップでそれを使用して、目的の順列を取得できます。

まず、次のマッピングについて考えてみましょう。入力をA1 A2 A3 A4 A5 ... An、として指定すると、値は、が1の場合はb1 b2 b3 b4 b5 ... bn選択し、 0の場合は選択しないことを意味します。Aibi

あなたの入力で、例えば:

0 0 1 1 0 1 -> C D F
0 1 0 0 1 1 -> B E F

これで、アルゴリズムは次のようになります。

  • n要素の数(あなたの場合は6)とmあなたが選択したい数として取ります。
  • 次のシーケンスを作成します。

    0 0 0 ... 0 1 1 1 ... 1
    \____ ____/ \____ ____/
         V           V
       n - m         m
    
  • 上記のシーケンスのすべての順列を取得します。

    • mシーケンスでマークされている要素を検索します
    • mそれらの要素 のすべての順列を取得し、それぞれについて:
      • やりたいことは何でも!
于 2012-07-04T14:05:40.867 に答える
0

私は間違っているかもしれませんが、ここに可能な順列の正しい量があると思います。6 人のプレーヤーの配列から 3 人のプレーヤーのみを選択します。つまり、最初のプレーヤーには 6 つの可能性があり、2 番目のプレーヤーには 5 つの可能性があり、3 番目のプレーヤーには 4 つの可能性があります。

最後に 3 人ではなく 4 人のプレイヤーを配置することにした場合、可能な順列の量は 6*5*4*3 になります。

私の数学が古すぎないことを願っています!

于 2012-07-04T14:04:27.203 に答える
0

あなたの問題は、6 つの要素のすべての順列を見つけることではありません。

問題は、3 つの要素を選択し、その順列をチェックすることです。

組み合わせの数 = C(6,3)*3! = 6! / 3!= 6*5*4。

C(6,3) - 6 つの要素から 3 つの要素を選択する場合 (順序に関係なく)

3!- 選択した 3 つの要素を注文するため。

これは、取得する必要がある組み合わせの正確な数です。(あなたがやる)

ただし、順列アルゴリズムを使用して、6 つの要素のすべての順列を取得できます。それよりも、最後の 3 つの要素を無視して、結果から重複を削除してください。

于 2012-07-04T14:03:22.500 に答える