- ベストアンサー
Cというよりロジックです。
組み合わせの問題なんですが、うまく説明できるか・・・・ A=(x,y,z) B=(a,b) C=(i,j,k,l,m) D=(d) ・ ・ ええと説明ですが、Aにはxかyかzが入るという意味です。Bにはaかbが入るという意味です。それでかならずA、B、C・・・の()の中からひとつは選ばなくては ならなくてA、B、C・・・と何個あるかわからない(何個でもOKなようにしたい) その条件でA,B,Cと各要素からひとつずつ選んで、全ての組み合わせを 出力したいんです。これを実現するのにどんな感じでロジックを組めばいいんでしょうか・・・。 出力例として 一個目、A(x),B(a),C(i),D(d)・・・。←これでひとつの出力 二個目、A(y),B(a),C(i),D(d)・・・。 ・ ・ってかんじで。 うーん、うまく説明できない・・・こんなんでも伝わってくれる方が いればお返事ください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
A,B,C,D,...のデータ構造やデータ格納方法はなんとかなったとして、 そこからの組み合わせを求めることについてです。 A,B,C,Dと組み合わせる対象の個数が決まっていれば(この場合4個) その個数分のループでも簡単ですが、対象の個数が決まっていない場合は 再帰で処理するのが、普通で簡単でしょう。 (といってもなれない人には敷居が高いようですが) とりあえず、サンプル作ってみました。 質問にあったデータの場合、30個(3x2x5x1)の値が出力されます。 #include <stdio.h> char data[][10] = { {'x', 'y', 'z'}, {'a', 'b'}, {'i', 'j', 'k', 'l', 'm'}, {'d'} }; int max_row = 4; int cnt = 0; void kumiawase(char ans[], int row) { int i; if(row == max_row) { ans[row] = '\0'; printf("%s\n", ans); cnt++; return; } for(i=0; data[row][i] != 0; i++) { ans[row] = data[row][i]; kumiawase(ans, row+1); } } int main() { char buf[20]; kumiawase(buf, 0); printf("cnt=%d\n", cnt); return 0; }
その他の回答 (1)
- heichan
- ベストアンサー率39% (41/104)
多分ご質問の趣旨は理解できたと思います。 要素数不特定の配列(?)を扱う場合、以下のような構造体を利用するのが一つの手だと思います。 struct hlist{ int c; /* A(...)に実際に入る数 */ hlist* p; /* hlist型へのポインタ */ } 例として最初のA(x,y,z)について言えば、最初に hlist a1,a2,a3; とやって、 a1.c=x; a2.c=y; a3.c=z; a1.p=&(a2); a2.p=&(a3); a3.p=0; と中身を入れます。リストの中に次のリストへのポインタが入っているのがミソです。 while文などを使うと、a1から順番にcの値を参照していく構文が作れます。 a3の続きが必要になった時は、a3.p=malloc(...)文などを使って直接メモリを割り当てれば プログラムの実行中にどんどん内容を増やせます(後でメモリを開放しないと具合が悪そうですが)。 A,B,C,D‥といった選択肢が不特定に続く場合は、 struct harrey{ hlist* hp; /* 各選択肢(hlist型)へのポインタ */ harray* p; /* 次のリストへのポインタ */ } harray t; とやってhpにhlist型へのポインタを入れてやれば、以下のような2重構文で 不特定の数の選択肢を順番に処理できるはずです。 p0=&t; while(p0!=0){ /*次の要素がなくなったらその選択肢の処理が終わる*/ pp=*p0.hp; while(pp!=0){ printf("XXXX ", &(*pp.c)); pp = *pp.p; /*次の要素を参照する*/ } printf("\n"); p0=*p0.p; /*次の選択肢を参照する*/ } 確かこんな風でよかったと思いますが、これはあくまで概要ですし、 そもそもプログラムはずいぶん久しぶりなので 今ひとつ自信がありません。参考程度と考えてください。 それでは。
お礼
すんません、締め切るの忘れてました・・・(汗 あれから2日くらいかえて目的のプログラムを つくることができました。ありがとうございました。