【发布时间】:2019-12-13 17:13:58
【问题描述】:
(对不起,标题不是最好的描述)
我正在玩图论,并生成一组给定输入数字的所有可能组合。给定输入集 {2,3,4},我可能的组合(其中有3!)是:
以下递归解决方案有效,但我不喜欢我必须“复制”输入向量以“删除”代表我正在关注的节点的元素以防止将其包含在输出中的事实再次。我要输出的元素存储在vecValues,而我当前可以选择的元素存储在vecInput:
void OutputCombos(vector<int>& vecInput, vector<int>& vecValues)
{
// When hit 0 input size, output.
if (vecInput.size() == 0)
{
for (int i : vecValues) cout << i << " ";
cout << endl;
}
size_t nSize = vecInput.size();
for (vector<int>::iterator iter = begin(vecInput); iter != end(vecInput); ++iter)
{
auto vecCopy = vecInput;
vecCopy.erase(find(begin(vecCopy), end(vecCopy), *iter));
vecValues.push_back(*iter);
OutputCombos(vecCopy, vecValues);
vecValues.pop_back();
}
}
void OutputCombos(vector<int>& vecInput)
{
vector<int> vecValues;
OutputCombos(vecInput, vecValues);
}
int main()
{
vector<int> vecInput{ 2,3,4 };
OutputCombos(vecInput);
return 0;
}
正如我的状态空间树所期望的那样,输出是
2 3 4
2 4 3
3 2 4
3 4 2
4 2 3
4 3 2
请问如何在不必为每个递归调用复制向量的情况下解决这个问题?
【问题讨论】:
-
为什么不创建图形结构?有节点和链接?
-
@bolov,我现在正在做的就是输出组合。我们可以用创建树节点来替换“当前”元素的添加;但是,这仍然无法解决必须在每个阶段复制向量才能删除元素的问题......你知道如何解决这个问题吗?
标签: c++ recursion graph-theory