我正在尝试生成所有球员组合,组成一支篮球运动员队伍。 假设有5个位置(SG,PG,SF,PF,C),我需要用9个玩家填充公鸡,每个位置2个,除了中心位置只有1个。
假设每个位置有10个玩家,我如何生成所有可能排列的列表。
我想从csv文件中的excel导入名称,然后将所有组合输出回另一个csv文件中的excel。
我可以弄清楚如何导入和导出csv的东西,但我对进行上述排列的最佳算法更感兴趣。
如果更容易生成排列,那很好,我可以很容易地消除excel中的重复。
谢谢!
答案 0 :(得分: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个人名单时,你会得到更高的运行时间,因为现在你正在处理更多的组合。
所以这取决于你有多少数据是否可行。