2011-02-07 2 views
1

Я пытаюсь создать все комбинации игроков, чтобы составить команду баскетболистов. Предположим, что есть 5 позиций (SG, PG, SF, PF, C), и мне нужно заполнить петух 9 игроками, по 2 из каждой позиции, кроме центрального положения, для которого есть только 1.комбинации игроков для команды в C

Предположим, у меня есть 10 игроков за каждую позицию, как я могу сгенерировать список всех возможных перестановок.

Я хотел бы импортировать имена из excel в csv-файл, а затем выводить все комбинации обратно в excel в другой файл csv.

Я могу понять, как сделать импорт и экспорт материалов 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. 

Тем не менее, важно помнить, что если у вас есть много игроков, что вы делаете это «грубая сила», которая будет включать в себя возвраты (возвраты ту же самая идея как циклы, которые я использовал выше, только он использует рекурсию), будет расти экспоненциально во время работы. Так, например, для 5 человек реестра, если у вас есть 10 центров, 20 вперед и 18 охранников, то время работает в основном:

10 * 20 * 20 * 18 * 18 = 1.296.000

(20 * 20, потому что нам нужны 2 фола, и 18 * 18, потому что нам нужны 2 стража).

1,296,000 не так уж плохо для времени работы, но когда вы начинаете говорить о 9 человеческих реестрах, вы получаете намного больше времени работы, потому что теперь вы имеете дело с большим количеством комбинаций.

Таким образом, это зависит от того, сколько данных у вас есть, насколько это возможно.

Смежные вопросы