【问题标题】:C - Printing a 2D-array in a spiral order outward from any given starting pointC - 从任何给定的起点以螺旋顺序向外打印二维阵列
【发布时间】:2016-05-18 22:54:28
【问题描述】:

我有一个二维字符数组。我试图弄清楚如何从任何给定的起点以向外螺旋的方式打印元素。我的想法是,在完成后,我基本上会有一个从起点到最长距离的有序列表。

我所说的外向螺旋是什么意思: 假设我们有:

1 2 3 4 5

6 7 8 9 一个

b c d e f

作为我们的二维数组,我随机选择一个包含“9”的 x 和 y 位置 (3,1)。

完成后对应的顺序为 9, a, f, e, d ,8 ,3, 4, 5, c, 7, 2, b, 6, 1。

注意,当螺旋到达边界时,它会按照您所期望的在下一个螺旋处继续。

我可以打印第一个“螺旋”,但我不明白如何检测下一个循环。

【问题讨论】:

    标签: c arrays algorithm sorting multidimensional-array


    【解决方案1】:

    你的函数会有原型

    void print_spiral(char arr[][], unsigned width, unsigned height, unsigned x, unsigned y);
    

    在函数中,您将首先打印arr[x][y],然后循环以(x,y) 为中心的连续方块。每个正方形的radius 等于边长的一半。您从radius 1 开始,然后是2、3,以此类推。

    要打印半径的平方 r ,您从 (x + r, y)(x + r, y - r),到 (x - r, y - r),到 (x - r, y + r),到 (x + r, y + r) 并返回开始。

    对于每个点(a, b),你只打印它,如果

    0 <= a < width
    0 <= b < height
    

    在每个方格中,您都可以跟踪是否打印了任何内容。当你有一个你没有的正方形时,你停止循环。

    这个大纲应该足够你开始编码了。

    上面的算法也许是最自然的,但它当然可以进一步加速,但以混淆为代价。

    【讨论】:

    • 除了最左边的数组索引之外,您需要一个宽度。对于 C99 及更高版本,您可以先传递 widthheight,然后在数组声明中使用它们。
    • @Mark Galeck。我很接近,但我对一件事感到困惑。 “要打印半径为 r 的平方,你从 (x + r, y) 到 (x + r, y - r), 到 (x - r, y - r), 到 (x - r, y + r ),到 (x + r, y + r) 并返回开始。”这个过程不会只打印出以 (x,y) 为中心、半径为 r 的正方形中包含的 5 个索引吗?
    • @HaniAl-shafei 在“go-from-to”中,“go”的意思是“walk”,所以通过中间的点,而不是直接“jump”。
    • @luserdroog 是的,因为 C 原因是的,但是这里还有另一个问题,不是纯粹的 C 声明,而是由于另一个原因,例程内部需要 width
    • @Mark Galeck。是的!我让它工作了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多