backtrackingというアルゴリズムテクニックを使用できます。
あなたが持っているプレイヤーの数によっては、ブルートフォースを使用してループを起こすことができます。たとえば、次のように2つの前方と1つの中心のすべての組み合わせを選択できます(これは技術を説明するために示したC++のサンプルです)。
#include <iostream>
#include <fstream>
#include <algorithm>
#include <numeric>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> centers;
vector<string> forwards;
centers.push_back("joey");
centers.push_back("rick");
centers.push_back("sam");
forwards.push_back("steve");
forwards.push_back("joe");
forwards.push_back("harry");
forwards.push_back("william");
for(int i = 0; i < centers.size(); ++i) {
for(int j = 0; j < forwards.size(); ++j) {
for(int k = j+1; k < forwards.size(); ++k) {
printf("%s %s %s\n",centers[i].c_str(), forwards[j].c_str(), forwards[k].c_str());
}
}
}
return 0;
}
出力:
---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
joey steve joe
joey steve harry
joey steve william
joey joe harry
joey joe william
joey harry william
rick steve joe
rick steve harry
rick steve william
rick joe harry
rick joe william
rick harry william
sam steve joe
sam steve harry
sam steve william
sam joe harry
sam joe william
sam harry william
> Terminated with exit code 0.
はしかし、それはあなたが選手の多くを持っている場合、あなたはそれがバックトラック含まれるであろう「ブルートフォース」、(バックトラックだ行うものは同じ考えであることを覚えておくことが重要です私が上で使用したループのように、再帰を使用するだけです)は実行時に指数関数的に増加します。あなたは10拠点、20の転送、および18のガードを持っているのであれば5人の名簿については、例えば、その後、実行している時間は基本的には次のとおりです。
10 * 20 * 20 * 18 * 18 = 1296000
(20 2人のガードが必要なので* 20、ガード2人が必要なので18 * 18)。
1,296,000は実行時間にはあまりにも悪くありませんが、9人の男性ロスターの話を始めると、もっと多くの組み合わせを扱っているため、実行時間が非常に長くなります。
したがって、これが実現可能かどうかは、どれだけのデータがあるかによって異なります。
出典
2011-02-07 15:43:46
dcp