假设我有一个以行优先顺序存储的 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/