我想在2D阵列上进行BFS,每个单元格都可以表示为pair<int,int>
。我使用queue<pair<int,int>>
来跟踪每个级别的单元格,但我发现没有一种聪明的方法可以跟踪深度。 (我不想定义另一个结构来记录每个级别的深度)
How to keep track of depth in breadth first search?
这是Java的解决方案。每个级别都以null
结束,一旦我们看到null
,我们就会增加深度。
我想知道在C ++中是否有类似优雅的解决方案。现在,我可以想到以下几种方式:
1)计算每个级别的单元格数(push()
),并在每个pop()
之后减少计数。 count == 0
后,请增加深度。
2)使用两个queue
并在每个级别的末尾用新的替换旧的pair<int,int>
。在每次迭代结束时增加深度。
3)可能会在队列中存储指向NULL
的指针并使用javascript
分隔级别?
答案 0 :(得分:0)
在精神上类似于将null插入队列的解决方案是仅插入不可能作为单元格出现的sentinel值。例如。 $(document).ready(function () {
$("#dropDownUl li").on('click', function () {
$('#dropDownBtn').text($(this).text());
});
});
答案 1 :(得分:0)
(1)可以工作,但是设置count = queue.size()会更好/更容易,并且每次弹出时都会减少它。当它变为0时,增加深度并再次设置count = queue.size()。
(2)工作正常。使用std :: swap切换队列。这就是我通常所做的,因为我喜欢外部<div class="parent">
<div class="child">
<div id='green'> </div>
<div id="orange"></div>
<div class="clear"> </div>
</div>
</div>
你也可以使用向量而不是真实的队列,因为你不是在同一个对象上推动和弹出。第二级循环只是通过向量的迭代。
(3)有效,但很浪费。其他类型的标记值可以起作用,但我认为上面的(1)在所有情况下都比这更好。
如果您更喜欢使用std :: deque而不是两个向量,我喜欢这样写:
for(int depth=0; !newnodes.empty(); ++depth)
...这与我上面的(1)非常相似,但是我得到了很好的深度循环,并且通过在queue.push_back(root);
for (int depth=0; !queue.empty(); ++depth)
{
for (size_t remaining=queue.size(); remaining>0; --remaining)
{
auto item = queue.pop_front();
//.... queue.push_back(...), etc.
}
}
上编写循环条件,我们可以避免对{{1}进行任何其他内循环检查}