c ++で組み合わせアルゴリズムを実装する(「リンゴを別のプレートに置く」)

ビウ

1と-1が交互に続き、その後にゼロが続く、すべて1で始まるn要素配列のグループを生成しました。

たとえば、n = 5の場合、配列は10000、1-1000、1-1100、1-11-10、1-11-11、

各配列のゼロ以外の数値の間にゼロを「挿入」する必要があります。上記の例の1-1100の場合、列挙は次のようになります。

1 -1 1 0 0、(一部の1と-1の間に0がないことを許可します。)

1 -1 0 1 0、

1 0 -1 1 0、

1 0 -1 0 1、

1 0 0 -1 1、

1 -1 0 0 1(最初の要素はまだ1である必要があります)

上記の形式で特定の配列に対してそのような列挙を生成するための優れたアルゴリズムはありますか?

問題は、同じリンゴを異なるプレートに入れて(異なるギャップにゼロを入れると異なる列挙が得られるため)、一部のプレートを空のままにしておくようなものだと思います。

数えるだけでなく、すべての可能性を印刷する必要があります。しかし、現在、私はそれを行うための良い方法を理解することができません。

トム・ザイチ

これは見た目よりも簡単です。

最初の要素は常に1です。したがって、これを無視して、回答の前に1を付けるだけです。

最初の1の後の非ゼロ要素は、常に-1、1、-1などです。このパターンは固定されているため、すべての非ゼロを1に置き換えてから、逆変換することができます。

これで、0と1のリストができたので、それらすべての順列を生成する必要があります。

すべてをPythonでまとめる:

#!/usr/bin/env python3

N = 5

def main():
    # k = number of nonzeros, minus the initial one that's always there
    for k in range(N):
        seq = [0] * (N - 1 - k) + [1] * k
        for p in next_permutation(seq):
            result = decorate(p)
            print(" ".join("{:2d}".format(i) for i in result))

# adapted from http://stackoverflow.com/questions/4250125
def next_permutation(seq):
    seq = seq[:]
    first = 0
    last = len(seq)
    yield seq

    if last == 1:
        raise StopIteration

    while True:
        next = last - 1
        while True:
            next1 = next
            next -= 1
            if seq[next] < seq[next1]:
                mid = last - 1
                while seq[next] >= seq[mid]:
                    mid -= 1
                seq[next], seq[mid] = seq[mid], seq[next]
                seq = seq[:next1] + list(reversed(seq[next1:last])) + seq[last:]
                yield seq[:]
                break
            if next == first:
                raise StopIteration
    raise StopIteration

def decorate(seq):
    # Convert 1's to alternating -1, 1, then prepend a 1 to whole thing
    seq = seq[:]
    n = -1
    for i in range(len(seq)):
        if seq[i]:
            seq[i] = n
            n = -n
    return [1] + seq

main()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

nからk個の要素のすべての組み合わせを返すアルゴリズムを実装する次のC#linqコードを理解する方法

分類Dev

文字列アルゴリズムC#の組み合わせ

分類Dev

C#の組み合わせアルゴリズム

分類Dev

cのアルゴリズムからforループを実装する

分類Dev

Cコンパイラでアルゴリズムを別のアルゴリズムに置き換えることはできますか?

分類Dev

cでスケジューリングアルゴリズムを実装するための提案

分類Dev

C ++:組み合わせアルゴリズム

分類Dev

組み合わせを見つけるためのアルゴリズムを構築する方法。その合計は数値に最も近く、その差はc#の範囲内にあります。

分類Dev

PythonからC ++へ:再帰を使用してKnapsackのすべての組み合わせを一覧表示するアルゴリズム

分類Dev

cでのソートアルゴリズムの実装

分類Dev

いくつかの変数のすべての可能な組み合わせセットを返す擬似コードまたはC#アルゴリズム

分類Dev

PowershellフォームスクリプトをC#アルゴリズムに適合させる

分類Dev

C ++でその擬似コードからアルゴリズムを実装する

分類Dev

Cのソートアルゴリズムを理解する

分類Dev

C ++でマージソートアルゴリズムを使用してカウント反転を実装する

分類Dev

Cでのシェルソートアルゴリズムの実装

分類Dev

C ++ STLを使用したDFSアルゴリズムの実装

分類Dev

Cで一意の要素の組み合わせを検索するためのアルゴリズム(結果の文字列内の要素の位置は関係ありません)

分類Dev

cでのクイックソートアルゴリズムの実装

分類Dev

合計の最大の組み合わせを実装するためのソートアルゴリズム

分類Dev

与えられた数と繰り返しの組み合わせのアルゴリズム?C ++

分類Dev

エピソード的なコンテキストで A3C アルゴリズムをトレーニングすることは実現可能ですか?

分類Dev

最も近いポイントのペアO(nlogn)アルゴリズム-c ++実装の一部のデータに関する問題

分類Dev

C ++で多くのステップアルゴリズムの「マネージャー」を作成するにはどうすればよいですか?

分類Dev

cでラプラス展開アルゴリズムを実装するにはどうすればよいですか?

分類Dev

C ++でのHeapのアルゴリズムの実装

分類Dev

JavaのDEFLATEアルゴリズムをC#に移植する

分類Dev

最新のC ++でクラシックな並べ替えアルゴリズムを実装するにはどうすればよいですか?

分類Dev

リストC#から組み合わせて個別のアイテムを取得する

Related 関連記事

  1. 1

    nからk個の要素のすべての組み合わせを返すアルゴリズムを実装する次のC#linqコードを理解する方法

  2. 2

    文字列アルゴリズムC#の組み合わせ

  3. 3

    C#の組み合わせアルゴリズム

  4. 4

    cのアルゴリズムからforループを実装する

  5. 5

    Cコンパイラでアルゴリズムを別のアルゴリズムに置き換えることはできますか?

  6. 6

    cでスケジューリングアルゴリズムを実装するための提案

  7. 7

    C ++:組み合わせアルゴリズム

  8. 8

    組み合わせを見つけるためのアルゴリズムを構築する方法。その合計は数値に最も近く、その差はc#の範囲内にあります。

  9. 9

    PythonからC ++へ:再帰を使用してKnapsackのすべての組み合わせを一覧表示するアルゴリズム

  10. 10

    cでのソートアルゴリズムの実装

  11. 11

    いくつかの変数のすべての可能な組み合わせセットを返す擬似コードまたはC#アルゴリズム

  12. 12

    PowershellフォームスクリプトをC#アルゴリズムに適合させる

  13. 13

    C ++でその擬似コードからアルゴリズムを実装する

  14. 14

    Cのソートアルゴリズムを理解する

  15. 15

    C ++でマージソートアルゴリズムを使用してカウント反転を実装する

  16. 16

    Cでのシェルソートアルゴリズムの実装

  17. 17

    C ++ STLを使用したDFSアルゴリズムの実装

  18. 18

    Cで一意の要素の組み合わせを検索するためのアルゴリズム(結果の文字列内の要素の位置は関係ありません)

  19. 19

    cでのクイックソートアルゴリズムの実装

  20. 20

    合計の最大の組み合わせを実装するためのソートアルゴリズム

  21. 21

    与えられた数と繰り返しの組み合わせのアルゴリズム?C ++

  22. 22

    エピソード的なコンテキストで A3C アルゴリズムをトレーニングすることは実現可能ですか?

  23. 23

    最も近いポイントのペアO(nlogn)アルゴリズム-c ++実装の一部のデータに関する問題

  24. 24

    C ++で多くのステップアルゴリズムの「マネージャー」を作成するにはどうすればよいですか?

  25. 25

    cでラプラス展開アルゴリズムを実装するにはどうすればよいですか?

  26. 26

    C ++でのHeapのアルゴリズムの実装

  27. 27

    JavaのDEFLATEアルゴリズムをC#に移植する

  28. 28

    最新のC ++でクラシックな並べ替えアルゴリズムを実装するにはどうすればよいですか?

  29. 29

    リストC#から組み合わせて個別のアイテムを取得する

ホットタグ

アーカイブ