0と1の組み合わせの作成方法と条件

このQ&Aのポイント
  • Visual Studio 2008 Express C++を使用して、指定の条件で0と1の組み合わせを作成するプログラムを作成しています。
  • 組み合わせのルールは、1の数が少ないほうから大きいほうへ、1の位置が左から右へ、指定した数の組み合わせを作ることです。
  • STLのnext_permutation()関数ではこのような条件を指定することはできないため、別の方法を探しています。
回答を見る
  • ベストアンサー

指定の条件での0と1の組み合わせの作成

0と1の組み合わせを指定の条件で作成するのにつまづいています。 (visual studio 2008 express C++) n桁の0と1の組み合わせを、 (A)1の数が少ないほうから大きいほうへ (B)1の位置が左から右へ (C)指定した数の組み合わせを作る というルールで作成するプログラムを作っています。 n=4桁で10の組み合わせをつくるとすると 0000  (1) 1000 (2) 0100 (3) 0010 (4) 0001 5) 1100 (6) 1010 (7) 1001 (8) 0110 (9) 0101 (10) という組み合わせをベクターのベクター もしくはstringのベクターという形でつくりたいのですがどうやればいいのかわからないでいます。 for ( int i = 0 ; i < 5; ++i){ } ループで 0 / 1 の 網羅的な組み合わせを作りはしましたが、そうすると (A) (B)の条件が満たせなくなってしまいます。 STL の next_permutation() はざっと見た限りでは今回のような条件を指定した組み合わせというのはできない(?)ようです。 解決法が分かる方がいらっしゃればなにか教えていただけたらありがたいです(できればコードも一緒に。。。) よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

プログラムを作ってみました。 // Programmed by Akayoroshi on 2013-05-04. #include <iostream> #include <string> using std::string; void show( string bp, int c ) { std::cout << bp << "(" << c << ")" << "\n"; } void gen( string bp, int n, int count, int &c, int m, int k ) { // n は show() に渡すためのパラメーター // count は生成したいパターンの数、c はカウンター // m と k は再帰を制御するためのパラメーター if ( c>=count ) return; if ( k==0 ) { c++; show( bp, c ); } else { for ( int i=n-m; i<=n-k; i++ ) { bp[i]='1'; gen( bp, n, count, c, n-i-1, k-1 ); bp[i]='0'; } } } void patterns( int n, int count ) { string bp( n,'0' ); // 長さ n すべて '0' の文字列 int c=0; for ( int k=0; k<=n; k++ ) gen( bp, n, count, c, n, k ); } int main(void) { patterns( 6, 30 ); } できあがったパターンを vedtor<string> の要素に追加するよう、関数showを作り変えれば実用に耐えるでしょう。

hydrozoa
質問者

お礼

丁寧な解説付きのコードありがとうございました!こちらでもコンパイルして希望の通りに動くのを確認できました。正直再帰の制御が全く不慣れで完全にコードを理解したとは言えないのですが実用としてはまさにそのまま使えます! C++は独学でやってるのですが再帰制御などは難しそうで敬遠してましたが、これを気に勉強してみようと思います。 本当にありがとうございました。

その他の回答 (1)

回答No.1

初めから条件(A)(B)(C)のすべてを満たすように生成するのではなく、いったん順序に関係なく全パターンを作ってから、条件(A)(B)を満たすような比較を使ってソートするというのも1つの手だと思います。 まあ、nの値を大きくしたときのパフォーマンスの問題もありそうですが、nがそんなに大きくないなら問題ないのでは。そもそも全パターンをvectorに格納しようとしてる時点でnが大きいとメモリが足りなくなりそうですし。

hydrozoa
質問者

お礼

アドバイスありがとうございます。いったん網羅的に作って後からソートするというのもありですね。ソートの仕方がややトリッキーにはなりそうですが、検討してみる価値はありそうです。

関連するQ&A

  • 組み合わせと順列 アルゴリズム

    こんにちは 組み合わせと順列についてです。 順序関係のある要素で構成される集合から一定の数をとり、順列を辞書順で生成する方法がわかりません。 うまく説明できないので、例を示します。 たとえば26文字のアルファベットから4文字を選んで辞書順に生成するプログラムはどのようにやればいいのでしょうか? このアルファベットの例だと abcd abce abcf ・・・ abcz abdc abde ・・・ zyxw のようになると思います。 要素と長さが決まっている場合で順列を生成する部分は大丈夫です。(C++ STLのnext_permutationにあたる部分) 一応自分なりに考えたやり方は26進数4桁のように考えて、それを1ずつ増やし、全体で2回以上使われていないかを調べる と思ったんですが、あまりスマートじゃないし要素がとびとびのアルファベットのときなどに応用が利かないと思いました。 指摘していただければ補足しますので、よろしくお願いします。

  • エクセルのマクロで、指定した条件を満足する組み合わせを表示する方法?

    エクセルで、例えば     イ ロ ハ A-a 3 6 0 A-b 0 5 1 A-c 2 0 5     イ ロ ハ B-a 3 0 0 B-b 5 3 1 B-c 0 2 0     イ ロ ハ C-a 0 5 0 C-b 0 4 5 C-c 0 0 2 のように幾つかのグループ(A、B、C)があって、 それぞれのグループに幾つかのサンプル(a、b、c)があって、 それぞれのサンプルに幾つかの属性(イ、ロ、ハ)があるとして、 (イ 5以上 ロ 10以上 ハ 5以上) のように属性を任意に指定すると、それぞれのグループから一つずつサンプルを選択して、 指定した条件を満足する組み合わせを表示する方法ってありますか? イ 5以上 ロ 10以上 ハ 5以上の指定だと、     イ  ロ  ハ A-a 3  6  0 B-a 3  0  0 C-b 0  4  5     6 10  5     イ  ロ  ハ A-a 3  6  0 B-b 5  3  1 C-b 0  4  5     8 13  6     イ  ロ  ハ A-b 0  5  1 B-b 5  3  1 C-b 0  4  5     5 12  7 のように表示してくれると良いのですが。 教えてください、よろしくお願いします。

  • 条件を付けて組み合わせを絞って平均を出す関数は?

    ABCに123を当てはめるとAから123、132、213、231、312、321で平均Aから2、2、2です。 A<Bという条件を付けるとAから123、132、231で平均Aから(1、33)、(2、67)、2です。 さらにA<Cという条件を付けると123、132で平均Aから1、(2、5)、(2、5)です。 さらにB<Cという条件を付けると123だけとなり平均はAから1、2、3です。 このように大小の条件を付けて成り立つ組み合わせを絞り込み、平均だけを出したいのですがこんな事が可能なエクセル関数はないでしょうか?今回は説明のためにABCだけでしたが実際はAからPに1から16を当てはめたいです。

  • VBの組み合わせプログラムについて。

    初めまして。複数部品からなる製品の組立途中の形状パターンを抽出する プログラムを作成しているのですが、良いループが組めず困っています。 例えばA,B,C,Dと4つの文字からなる以下のような組み合わせ作成するループ文を作成したいです。 条件 ・入力文字数は可変します。A,B,C,D→A,B,C,D,E ・組み合わせ内で同じ文字は2度使用されません。 ・A,B,CとB,C,Aは同一とします。 1文字のパターン A B C D 2文字のパターン A,B A,C A,D B,C B,D C,D 3文字のパターン A,B,C A,C,D B,C,D 4文字のパターン A,B,C,D 4文字からなるパターンは全部で14パターンになります。 以上、宜しくお願い致します。

  • クエリの条件指定について

    初心者です。 oracle 9i で下記の tmp テーブルがあります。 カラムはNoとFlgの2つだけです。 Flgに「A」が存在し、かつ、Flg 「B」が存在しないNoを取得したい場合 どのようにクエリを作ればよいのでしょうか? <tmp テーブル> No   Flg 1    A 1    B 2    A 3    B 4    A 4    C 5    A 5    B 5    C 上記テーブルから結果として、No 2 と 4 だけを取得したいのです。 where Flg='A'のあとにnot existsとかでできそうな気がしたのですが どのように条件指定すればよいのでしょう?

  • 指定した条件でのリストの作成

    エクセルについての質問です。 データの入力規則にてリストを作成することがよくあるのですが、条件によってリストを作成することは出来ないのでしょうか。  A列 B列 1 あ A 2 い A 3 う B 4 え A 5 お B B列の値が「A」のものだけのリストを作成したいのです。 リストには、 「あ」▼ 「い」 「え」 の3つだけ表示されるようにしたいのです。 色々試してみましたが上手くできませんでした。 よろしくお願いします。

  • 組み合わせを実際に作成したい

    8人を4人づつのA・B2組に振り分ける組み合わせは 70通りと計算では出たのですが、実際に組み合わせを 作成すると70通り出来ません。 エクセルで関数を使って実際の組み合わせを作成することは出来るのでしょうか。 もし、出来るのならば、やり方も教えていただければと思います。 宜しくお願いします。

  • エクセルで決められた合計になる組み合わせを作成

    エクセルを使用し、決められた合計になるような数値の組み合わせを表示するようにしたいのですが、どのようにしたらよいか皆さん教えて下さい。 例えば、 B列に 100・50・70・62・58・70・・・と数値が入力されています。 C1に300と入力しておきます。 300になる組み合わせはどれとどれ・・・なのかというものを作成したいです。 多数ある場合は、全ての組み合わせを表示したいです。 表示例として B3とB5とB15・・・を合わせると合計C1が300になる、又は298又は302になるという表示をしたいのですがどのようにしたらよいでしょうか。 A列にコードを入力しているので数値の重複はありません。 宜しくお願い致します。

  • テーブル作成クエリの抽出条件について

    テーブル作成クエリの抽出条件について テーブルAとテーブルBを使って、テーブル作成クエリを作ろうとしています(テーブルC) その際、ある1つの項目に文字数指定する抽出条件を設定したいのです ひっぱってきたその項目のデータは、全て50文字以上あるのですが それを最大36文字に設定して、それ以降の文字は「切り捨て」にした形で テーブルCを作成したいのです。 この場合の抽出条件はどのように入力すればよいのでしょうか?? どなたか親切な方、教えて下さい。 また、質問内容に不備がありましたらご指摘をお願いします。

  • イベントの組み合わせ

    こんにちは。 団体さん同士のイベントの組み合わせの作成方法について困っています。 全10団体、1日に2団体1組で5日工程を決めたいのですが何通りもありキリがありません。 例えば仮に下記の組み合わせのパターン1だとして ・パターン1 1/1 a & b 1/2 c & d 1/3 e & f 1/4 g & h 1/5 i & j ・パターン2(cとdを入れ替えました) 1/1 a & c 1/2 b & d 1/3 e & f 1/4 g & h 1/5 i & j というように若干ずらしつつ全パターンを作りたいと思っています。 今のところ順列や組み合わせでは思った結果を得ることができず、手作業では途方もないです。 何か良い方法はないでしょうか? どうぞお力お貸しください。 よろしくお願いします。