回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。
class pailiezuhe{
public:
//将要返回的最终结果
std::vector<vector<int>> m_resVc;
//记录元素有没有被使用
std::vector<bool> usedVc;
void fun1(vector<int> perms, int nindex,vector<int> &p)
{
if (nindex == perms.size())
{
m_resVc.push_back(p);
return;
}
for (int i = 0; i < perms.size();i++)
{
if (usedVc[i] == false)
{
p.push_back(perms[i]);
usedVc[i] = true;
fun1(perms, nindex + 1, p);
usedVc[i] = false;//回溯
p.pop_back();
}
}
}
vector<vector<int>> getperms(std::vector<int> perms)
{
//清空结果
m_resVc.clear();
if (perms.size() == 0)
{
return m_resVc;
}
//初始化元素使用状态。
usedVc = vector<bool>(perms.size(), false);
std::vector<int>p;
fun1(perms, 0, p);
return m_resVc;
}
};
int main()
{
pailiezuhe s;
vector<vector<int>> sss = s.getperms({ 1, 2, 3});
for (auto vc :sss)
{
for (auto node :vc)
{
cout << node << " ";
}
cout << endl;
}
cout << "size:" << sss.size() << endl;
system("pause");
return 0;
}
结果:
下图分析