c++ - 从体积或区域中的起点向外迭代而不对其进行排序

标签 c++ loops graph-algorithm

假设我有一个以行优先顺序存储的 4x3 线性整数数组。布局(索引)如下所示。假设每个索引处的值与索引相同。

00 01 02 03
04 05 06 07
08 09 10 11

我可以按如下方式遍历这个数组:

for(int y = 0; y < 3; ++y)
   for(int x = 0; x < 4; ++x)
       std::cout << array[y*4+x] << ",";

我会得到

00,01,02,03,04,05,06,07,08,09,10,11,

当然,我可以用稍微不同的方式循环:

for(int x = 0; x < 4; ++x)
   for(int y = 0; y < 3; ++y)
       std::cout << array[y*4+x] << ",";

得到

00,04,08,01,05,09,02,06,10,03,07,11,

但是有没有一种方法,无需先对数组进行排序,就可以循环遍历它以获得以下(或类似的)结果:

05,04,01,06,09,00,02,10,08,07,03,11

也就是说,从某个指定位置开始 [x=1,y=1] 并以(某种)螺旋形向外迭代,按距离排序。

05 02 06 10
01 00 03 09
08 04 07 11

我知道我可以通过首先根据一些返回与 [x=1,y=1] 的距离的谓词对数组进行排序来实现这一点,但是(为了性能)是否可以不这样做第一次排序?


编辑:

具体来说,我只想从点 [x=1,y=1] 开始并进行迭代,就好像这些点已经通过 Manhatten (|x1-x2| + |y1-y2|) 甚至欧几里德 (sqrt((x1-x2)^2 + (y1-y2)^2)).

这是一个更大的数组。它不必完全像这样,因为它可以满足排序,具有不同的输出(例如,它可以是 CCW 而不是 CW)。

05 01 06 11 17
04 00 02 09 15
08 03 07 14 18
13 10 12 16 19

最佳答案

以正确的顺序为螺旋制作一系列偏移,对于任何起始位置都足够长。作为静态表,或作为生成函数。

遍历该偏移序列,将每个偏移序列添加到起始坐标。跳过任何越界坐标。找到 width * height 有效坐标时停止

关于c++ - 从体积或区域中的起点向外迭代而不对其进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49426611/

相关文章:

c++ - Boost 多索引容器与基于 std::unordered_map( map 的 map )的多级映射容器

bash - 在脚本中使用 `until` 和 `/usr/bin/timeout`

algorithm - "celebrity"算法的最优解

c - do while 1-4 菜单循环不断重复非数字输入

javascript - jQuery 循环中 div 的不同 CSS

在加权、有向、循环图中查找从 A 到 B 的不同路径的算法

python - 多个机器人同时进行路径规划

c++ - std::list remove_if 使用堆栈中的状态

c++ - 如何存储类似库存的数字列表?

c++ - 我可以从这个矩阵算法中得到旋转吗