【问题标题】:C++ maze problem, how to remove duplicates?C++迷宫问题,如何去除重复?
【发布时间】:2021-06-24 15:05:07
【问题描述】:

我试图使用回溯来解决众所周知的迷宫问题。 现在,对于每个地方,我应该尝试朝 4 个不同的方向前进:

[i+1,j] [i-1,j] [i,j+1] [i,j-1]

在这种情况下,我如何使用 for 循环,而不是重复我的代码 4 次来处理每个方向?

如果我这样做:

for (int k=-1;k<2;k+=2)
{
    travel(i+k,j);
}

这不会涵盖所有情况。

【问题讨论】:

  • pdf20:这个问题仍然悬而未决(因为您还没有接受答案)。你能解决问题吗?如果您在没有任何提供的答案帮助的情况下解决了它,请提供您自己问题的答案。它可能会在将来帮助其他有类似问题的人。

标签: c++ code-duplication


【解决方案1】:

这可以通过一个简单的数学技巧来实现。

j 需要保持不变时,i 变化1 单位,当i 需要保持不变时,j 变化1 个单位。

因此,只需检查要添加到ij 的值的绝对值之和是否等于1

for(int k=-1;k<2;k++){
    
    for(int l=-1;l<2;l++){
        
        if(abs(k) + abs(l) == 1){
            //cout<<k<<" "<<l<<endl;            
            travel(i+k, j+l);
        } 
    }
}

【讨论】:

    【解决方案2】:

    您可以创建一个包含 4 个元素的数组,其中包含可能的组合:

    #include <array>   // array
    #include <utility> // pair
    
    // ...
    
    void foo() {
        static std::array<std::pair<int, int>, 4> dir{
            {1, 0}, {-1, 0}, {0, 1}, {0, -1}
        };
    
        // going through the 4 combinations
        for (auto[x, y] : dir) {
            travel(i + x, j + y);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2019-06-20
      • 2022-08-22
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多