我有一组二维字符。我试图找出如何从任何给定的起点以外向螺旋方式打印元素。我的想法是,我基本上会有一个有序列表,从完成时的起点开始,距离最短到最长。
我的意思是向外螺旋: 假设我们有:
1 2 3 4 5
6 7 8 9 a
b c d e f
作为我们的2d数组,我随机选择一个包含'9'的x和y位置(3,1)。
完成时的相应顺序为9,a,f,e,d,8,3,4,5,c,7,2,b,6,1。
请注意,当螺旋线到达边界时,它会像下一个螺旋线那样继续。
我可以打印第一个“螺旋,但我不明白如何检测下一个循环。
答案 0 :(得分: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
在每个方格中,如果您打印过任何东西,都会跟踪。当你有一个你没有的方格时,你就会停止循环。
这个大纲应该足以让你开始编码。
上述算法可能是最自然的,但它可以以混淆为代价进一步加速。