c++ - 更智能的排列循环

标签 c++ algorithm

我有一个 3 x 3 的 bool 值网格,我感兴趣的是我可以拥有恰好三个“活”单元格的方法的数量(根据我的计算,有 56 种排列)。旋转对称性无关紧要,但活细胞彼此无法区分。

假设我正在索引网格中相对于质心的值:

-------------------
|-1,-1| 0,-1| 1,-1|
-------------------
|-1,0 |     | 1,0 |
-------------------
|-1,1 | 0,1 | 1,1 |
-------------------

是否有一个很好的循环可以用来计算 56 种排列? (我刚刚把它全部打完,我很想知道我是否可以更聪明一点)。

我使用的是 C++,但基本算法在任何语言或伪语言中都会很棒,如果它很清楚的话。

最佳答案

您可以使用 next_permutation .

例如,假设字符串下面 x 中的每个字符代表网格中的一个单元格(质心单元格除外)从左上角开始到右下角。您可以运行此代码来查找所有可能的排列,在循环内,字符串 x 将代表一种可能的排列,其中 1 是活细胞,0 是死细胞。

int main() {
  string x = "00000111";
  int cnt = 0;
  do {
    ++cnt;

    // do something useful with this configuration...

  } while(next_permutation(x.begin(),x.end()));
  cout<<cnt<<endl;
  return 0;
}

关于c++ - 更智能的排列循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791289/

相关文章:

确定 A 是否在 B 的倍数的 X 范围内的算法

c++ - 在 OpenCV 中使用 hog.compute(...) 访问冲突

c++ - Doxygen 错误 : Failed to open temporary file/path/to/file/doxygen_objdb_3332. tmp

c++ - 具有继承历史的 CRTP 插件自动注册(尝试但失败了 SFINAE)

algorithm - 在递归算法和事件驱动的消费者之间进行协调的模式

c# - Eratosthenes 筛法改进后运行速度变慢

c++ - 具有取决于其他对象的参数的谷歌模拟类构造函数

c++ - 使用 auto 访问类的私有(private)结构

python - 制作反向五星级评级计算器的最佳方法

c++ - 错误 : invalid operands to binary expression when comparing iterators using ! =