0

ユーザーに提示する必要のある順序付けられた文字列があります。

ABCCDDCBBBCBBDDBCAAA

'B'で表されるオブジェクトにはタグが付けられ、2つのBの後に'〜'が付きます。

AB~CCDDCB~BBCBBDDBCAAA
AB~CCDDCBB~BCBBDDBCAAA
AB~CCDDCBBB~CBBDDBCAAA
and so on...

私はハワード・ヒナントの組み合わせライブラリを使用しましたが、この単純なケースでうまく機能します。私のテストコードは、for_each_combinationを介して送信されたintとして場所のベクトルを使用します。

ただし、Bに複数のタグがある場合はどうすればよいかわかりません。

たとえば、合計4Bにタグを付ける必要があります。2つは「〜」、2つは「#」です。

AB~CCDDCB~B#B#CBBDDBCAAA
AB#CCDDCB~B~B#CBBDDBCAAA
AB~CCDDCB#B~B#CBBDDBCAAA
AB#CCDDCB#B~B~CBBDDBCAAA
ABCCDDCB~B~B#CB#BDDBCAAA
and so on...

私が書き出した擬似コードはカスケードです。最初のfor_each_combinationの後、結果の組み合わせごとに、1つおきの場所を別のベクトルにコピーし、別のfor_each_combinationを実行します。

使用する組み合わせの数を考えると、もっと良い方法があることを願っています。

4

2 に答える 2

2

これは宿題のように聞こえるので、まずコードを提供するだけではなく、次に[宿題]タグを追加しました。

現在、配置するマーカーが4つある場合、妥当な解決策は、ネストされたforループのセットであり、そのうちの4つは

マーカーは7つの位置に制限されているため、0から6までを数えます。

次に、それを文字列内の位置に変換します

次に、マーカー付きの文字列を出力します

これは簡単にできることを確認しました

さらにサポートが必要な場合は、新しい質問をしてください(そしてこれまでに得たものを示してください)

于 2012-06-18T20:39:07.097 に答える
1

少し見てから自分の質問に答えたと思います。

まず、ハワードのライブラリからエルベの組み合わせライブラリに切り替えました。主な魅力は、next_combinationを使用すると、次のように組み合わせ計算を連鎖させることができるということです。

do {
    do {
    cout << values << endl;
    } while (next_combination(values.begin() + 3, values.begin() + 5, values.end()));
} while (next_combination(values.begin(), values.begin() + 3, values.end()));

これをイテレータにマッサージする必要がありますが、これはまさに私が必要としているものです。

于 2012-06-18T21:04:17.633 に答える