AIと戦って、あなたの人生のリスク診断 >>

外部からの入力で複数のオブジェクトを生成し、それらの可能な組み合わせをつくる方法でつまずいています。

例えば
class mochimono
{
public:
string name;
int weight
int maximum_number;
};

というクラスを設定します。生成されるオブジェクトには名前と重さのほか”最大何個まで持ちうるか(設定できるか)”というパラメータがあります。
たとえば最大2つまでもてるのApple、最大1つまで持てるBananaという2つのオブジェクトをつくると

name:Apple
weight:2
maximum_number:2

name:Banana
weight:3
maximum_number:1

ありうる組み合わせは
Apple x 0, Banana x 0
Apple x 0, Banana x 1
Apple x 1, Banana x 0
Apple x 1, Banana x 1
Apple x 2, Banana x 0
Apple x 2, Banana x 1
となります。
この組み合わせを、例えば最後の組み合わせであれば”Apple, Apple, Banana"というオブジェクトのベクター”としてつくり、全体を”オブジェクトのベクターのベクター”として管理し、その後別の処理を行いたいと思っています。
ですが、オブジェクトが複数種類作られることを想定してこの組み合わせを”オブジェクトのベクターのベクター”として実現するアルゴリズムが作成できずに困っています。
アルゴリズム自体が思いつかず、抽象的で分かりずらいかもしれませんが、解決策があればよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ん~, なんかよくわからん....


「オブジェクトが複数種類作られることを想定して」の「オブジェクト」というのは「Apple」とか「Banana」とか言ってるやつのこと? でも「オブジェクトの種類 = クラス」としては 1つだしなぁ....

効率を無視すれば
vector<vector<mochimono> > enumerate(const vector<mochimono> &items)
{
vector<vector<mochimono> > ret;
for (auto item: items) {
vector<vector<mochimono> > current = ret;
ret.clear();
for (auto &bucket: current) {
ret.push_back(bucket);
for (int i = 0; i < item.maximum_numbers; ++i) {
bucket.push_back(item);
ret.push_back(bucket);
}
}
}
return ret;
}

のような感じ (要 C++0x) でいけると思うんだが.

この回答への補足

わかりにくくて申し訳ないです。
>「オブジェクトが複数種類作られることを想定して」の
>「オブジェクト」というのは「Apple」とか「Banana」とか
>言ってるやつのこと? でも「オブジェクトの種類 = クラス」
>としては 1つだしなぁ....
「オブジェクト」とはApple, Banana等のことです。ですので「オブジェクトの種類が複数」というのは正しくなかったですね。。。 クラスはmochimonoという1種類でそれをつかってApple.Banana,さらにPeachなどオブジェクトが複数つくられる、ということを意図しました。

補足日時:2011/04/05 12:52
    • good
    • 0
この回答へのお礼

具体的なコードありがとうございました。

お礼日時:2011/04/06 06:49

こんなん↓でいいかしら



#include <iostream>
#include <array>
#include <algorithm>
#include <string>

using namespace std;

template<typename T, int N>
bool generate_next(array<T,N>& ar, const array<T,N>& lm) {
for ( int digit = 0; digit < N; ++digit ) {
if ( ++ar[digit] == lm[digit] ) {
ar[digit] = 0;
} else {
break;
}
}
return any_of(ar.begin(), ar.end(), [](int n) { return n != 0; });
}

int main() {
const int N = 3;
array<string,N> fruits = { "apple", "banana", "cherry" };
array<int,N> limits = { 3, 2, 2 };
array<int,N> counts = { 0, 0, 0 };
do {
for ( int i = 0; i < N; ++i ) {
cout << fruits[i] << ":" << counts[i] << ' ';
}
cout << endl;
} while ( generate_next(counts, limits) );
}

--- 実行結果 ---
apple:0 banana:0 cherry:0
apple:1 banana:0 cherry:0
apple:2 banana:0 cherry:0
apple:0 banana:1 cherry:0
apple:1 banana:1 cherry:0
apple:2 banana:1 cherry:0
apple:0 banana:0 cherry:1
apple:1 banana:0 cherry:1
apple:2 banana:0 cherry:1
apple:0 banana:1 cherry:1
apple:1 banana:1 cherry:1
apple:2 banana:1 cherry:1
    • good
    • 0
この回答へのお礼

詳しいコードありがとうございます。まさにこんな感じの使い方をしたかったのです。考えていたよりずっと短いコードで実現されていておどろきました。

お礼日時:2011/04/06 06:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング