2011-02-07 3 views
1

バスケットボール選手のチームを構成するすべての選手の組み合わせを生成しようとしています。 5つのポジション(SG、PG、SF、PF、C)があるとしましょう。唯一のセンターポジションを除く各ポジションの2人、9人の選手で鶏を記入する必要があります。Cチームの選手の組み合わせ

私は各ポジションで10人のプレイヤーが、どのようにすべての可能な順列のリストを生成できますか?

私はcsvファイルでExcelから名前をインポートして、すべての組み合わせを別のcsvファイルでExcelに戻したいと考えています。

私はcsvのインポートとエクスポートの方法を理解できますが、私は上記の順列を行うための最良のアルゴリズムにもっと興味があります。

パーミュテーションを生成する方が簡単な場合は、それだけでなく、Excelで重複を簡単に排除できます。

ありがとうございます!

答えて

1

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人の男性ロスターの話を始めると、もっと多くの組み合わせを扱っているため、実行時間が非常に長くなります。

したがって、これが実現可能かどうかは、どれだけのデータがあるかによって異なります。

関連する問題