我有一个字符串向量,大小相同。
我必须构建满足某些条件的字符串列表作为解决方案。
伪代码算法将是这样的:
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;
}
问题是解决方案在没有控制的情况下持续增长。 你能告诉我怎么处理吗?并做一个适当的回溯?
答案 0 :(得分:1)
一个问题是您在迭代时修改dictionary
。修改向量会使该向量的迭代器无效,因此下次使用时word
不再有效。这可能会崩溃或失败。但是erase
函数返回一个新的有效迭代器,你可以使用它来继续迭代。
此外,您基本上会删除回溯函数中dictionary
的所有元素,而且dictionary
中没有剩余元素。您可能希望在递归调用返回后重新添加已擦除的元素?