- ベストアンサー
0と1の組み合わせの作成方法と条件
- Visual Studio 2008 Express C++を使用して、指定の条件で0と1の組み合わせを作成するプログラムを作成しています。
- 組み合わせのルールは、1の数が少ないほうから大きいほうへ、1の位置が左から右へ、指定した数の組み合わせを作ることです。
- STLのnext_permutation()関数ではこのような条件を指定することはできないため、別の方法を探しています。
- みんなの回答 (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を作り変えれば実用に耐えるでしょう。
その他の回答 (1)
- fresh_homepie
- ベストアンサー率64% (24/37)
初めから条件(A)(B)(C)のすべてを満たすように生成するのではなく、いったん順序に関係なく全パターンを作ってから、条件(A)(B)を満たすような比較を使ってソートするというのも1つの手だと思います。 まあ、nの値を大きくしたときのパフォーマンスの問題もありそうですが、nがそんなに大きくないなら問題ないのでは。そもそも全パターンをvectorに格納しようとしてる時点でnが大きいとメモリが足りなくなりそうですし。
お礼
アドバイスありがとうございます。いったん網羅的に作って後からソートするというのもありですね。ソートの仕方がややトリッキーにはなりそうですが、検討してみる価値はありそうです。
お礼
丁寧な解説付きのコードありがとうございました!こちらでもコンパイルして希望の通りに動くのを確認できました。正直再帰の制御が全く不慣れで完全にコードを理解したとは言えないのですが実用としてはまさにそのまま使えます! C++は独学でやってるのですが再帰制御などは難しそうで敬遠してましたが、これを気に勉強してみようと思います。 本当にありがとうございました。