0

可能的重复项:以螺旋形式
循环 以螺旋形式
编写字符串 以
螺旋顺序打印二维数组 以螺旋顺序打印二维
数组

我们有一个矩阵形式的数据

0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
0 0 0 0 0

以这种方式存储在一维数组中

[0 0 0 0 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0]

这是一个零填充的 3x3 数组转换为 5x5。我们知道开始索引和结束索引。

如我们所见,我们可以执行 25 次操作并打印所有值,但如果我们按照螺旋顺序进行,理想情况下应该只执行 9 次操作。

有谁知道如何做到这一点?

我们知道行数和列数。这里将是 rows=5 cols=5。

因此,起始索引为 rows+1,结束索引为 rows*cols-6

我将其可视化为螺旋顺序遍历。

4

2 回答 2

0

假设您的5x5矩阵假设索引基数为零,您知道行索引是:
0,1,2,3,4
5,6,7,8,9
10,11,12,13,14
15,16,17,18,19
20,21,22,23,24

你知道你的第一个索引是6,最后一个是18. 因此,作为起点,您知道可以消除矩阵的以下部分:

0,1,2,3,4

19,20,21,22,23,24,25

这算作2操作。

您还知道,由于您从 index 开始,6并且3x3您只需要转到 index 8,因此这是一项操作。

然后你需要添加5到你之前的6这个产量索引11并再次继续(2总共操作)当前操作计数是5

再次执行此操作11,您将获得16一次操作。再进行 2 次操作,最终得到18. 现在总共是 8 次操作。

于 2013-01-11T19:29:11.067 回答
0

我会做这样的事情:

   POINT ul = (start_idx/width, start_idx%width);
   POINT br = (end_idx/width, end_idx%width);
   POINT p = ul
   dir = RIGHT;
   while (ul != br)
     visit(ARRAY[p.x+p.y*WIDTH])
     case dir
        when RIGHT:   
           p.x+=1
           if (p.x==br.x) 
             dir = DOWN
             ul.y++;
         when DOWN
           p.y+=1
           if (p.y==br.y) 
             dir = LEFT
             br.x--;
         when LEFT: 
            //like RIGHT but -1 and adjust br.y upwards when done
         when UP:
            //like DOWN but -1 and adjust ul.x rightward when done
    endwhile

这个想法是跟踪要访问的虚拟 x 和 y。沿着由起点和终点定义的框的侧面移动要访问的点。完成访问后,向内调整两侧。

于 2013-01-11T19:57:19.487 回答