C++迷宫问题,如何去除重复?

问题描述

我试图使用回溯来解决众所周知的迷宫问题。 现在对于每个地方,我应该尝试朝 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个单位。

因此,只需检查要添加到 ji 的值的绝对值之和是否等于 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);
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...