递归函数调用 - 生成排列和回溯

时间:2011-02-05 19:18:30

标签: c++ recursion backtracking

我有一个字符串向量,大小相同。
我必须构建满足某些条件的字符串列表作为解决方案。

伪代码算法将是这样的:

backtrack(N)
if solution_valid()
    print solution
else
    for each word in vector
        if(possible candidate)
           backtrack(N+1)

我迷失了如何实际编写代码。

我不明白如何保存当前的解决方案,传递给函数的参数类型......

虽然我认为这是完全错误的,但我有一些东西:

int backtrack(vector<string> &dictionary, vector<string> &solution, int current_row)
{
cout << "current row: "<< current_row <<  " of: " << rows << endl;
if(current_row == rows /*&& square_completed(solution)*/)
{
    vector<string>::iterator word;
    for(word = solution.begin(); word != solution.end(); ++word)
    {
        cout << *word << endl;

    }
    return 0;
}

vector<string>::iterator word;
for(word = dictionary.begin(); word != dictionary.end(); ++word)
{
    backtrack(dictionary,solution,current_row+1);
    solution.push_back(*word);


}

return 1;

}

问题是解决方案在没有控制的情况下持续增长。 你能告诉我怎么处理吗?并做一个适当的回溯?

1 个答案:

答案 0 :(得分:1)

一个问题是您在迭代时修改dictionary。修改向量会使该向量的迭代器无效,因此下次使用时word不再有效。这可能会崩溃或失败。但是erase函数返回一个新的有效迭代器,你可以使用它来继续迭代。

此外,您基本上会删除回溯函数中dictionary的所有元素,而且dictionary中没有剩余元素。您可能希望在递归调用返回后重新添加已擦除的元素?

相关问题