问题描述
我试图使用回溯来解决众所周知的迷宫问题。 现在对于每个地方,我应该尝试朝 4 个不同的方向前进:
[i+1,j] [i-1,j] [i,j+1] [i,j-1]
不是重复我的代码 4 次来处理每个方向,在这种情况下我如何使用 for 循环?
如果我这样做:
for (int k=-1;k<2;k+=2)
{
travel(i+k,j);
}
这不会涵盖所有情况。
解决方法
这可以通过一个简单的数学技巧来实现。
当dst(x,y) =
{
maxvalue if src(x,y) > thresh
src(x,y) otherwise
}
需要恒定时,j
变化i
个单位,当1
需要恒定时,i
变化1个单位。
因此,只需检查要添加到 j
和 i
的值的绝对值之和是否等于 j
。
1
,
您可以创建一个包含 4 个元素的数组,其中包含可能的组合:
#include <array> // array
#include <utility> // pair
// ...
void foo() {
static std::array<std::pair<int,int>,4> dir{
{1,0},{-1,{0,1},-1}
};
// going through the 4 combinations
for (auto[x,y] : dir) {
travel(i + x,j + y);
}
}