其实也是利用了数学里的排列组合的知识,下面看看代码吧。算法思想是采用了回溯法。
class doorsolution
{
public:
vector<vector<int>> m_resVc;
void fun1(int nstart,int n,vector<int> &p,int k)
{
if (p.size() == k)
{
m_resVc.push_back(p);
return;
}
for (int i = nstart; i <= n; i++)
{
p.push_back(i);
fun1(i + 1, n, p, k);
p.pop_back();
}
}
vector<vector<int>> GetCnk(int n, int k)
{
if (n == 0||k == 0||k>n)
{
return m_resVc;
}
m_resVc.clear();
vector<int> p;
fun1(1, n, p,k);
return m_resVc;
}
};
int main()
{
string door[4] = { "研发部东门磁", "研发部南门磁", "研发部西门磁", "研发部北门磁" };
doorsolution s;
auto vc = s.GetCnk(4, 1);
for (auto vcx :vc)
{
for (auto node:vcx)
{
cout << door[node - 1].c_str() << ",";
}
cout << endl;
}
auto vc2 = s.GetCnk(4, 2);
for (auto vcx : vc2)
{
for (auto node : vcx)
{
cout << door[node - 1].c_str() << ",";
}
cout << endl;
}
auto vc3 = s.GetCnk(4, 3);
for (auto vcx : vc3)
{
for (auto node : vcx)
{
cout << door[node - 1].c_str() << ",";
}
cout << endl;
}
auto vc4 = s.GetCnk(4, 4);
for (auto vcx : vc4)
{
for (auto node : vcx)
{
cout << door[node - 1].c_str() << ",";
}
cout << endl;
}
system("pause");
return 0;
}
结果: