以逆时针顺序打印2d阵列

时间:2013-03-02 06:26:09

标签: algorithm matrix

如何按逆时针顺序打印数组?我知道着名的“以螺旋顺序打印阵列”算法,但看看如何以逆时针方式打印它会很有趣

1 个答案:

答案 0 :(得分:0)

假设你想到了一个二维坐标数组......

基本上你必须按y和x坐标的商的atn对数组进行排序,然后按顺序打印它们。适当地适应杆和标志的变化,同时避免昂贵和数值不稳定的算术使实施变得复杂。以下伪代码用于说明原则。

点集被划分为9个类别,编号为0到8.#0包含将首先打印的点(0,0),#1,3,5,7包含正y轴上的点,负x轴,负y轴和正x轴。在这些类别中的每个类别中,将按照距离原点的距离增加的顺序打印点。类别#2,4,6,8分别包含来自第二,第三,第四和第一象限的点。在每个类别中,点将逆时针打印。位于原点相同矢量上的任何点将按距离原点增加的顺序打印。

a:array of point(x:number,y:number)成为您的数组。将f:array of (f1:number, f2:number, f3:number)分段定义为

f[i].f1 :=
    let x := a[i].x, y := a[i].y;
    if x=0 then
        if y=0 then
            0
        else
            if y>0 then 1 else 5
        endif
    else
        if y=0 then
            if x>0 then 7 else 3
        else
            if x>0 and y>0 then
                8
            elsif x>0 and y<0 then
                6
            elsif x<0 and y<0 then
                4
            else
                2
            endif
        endif
    endif;

f[i].f2 :=
    let x := a[i].x, y := a[i].y, h := f[i].f1;
    if odd(h) then
        abs(x) + abs(y)
    else
        if h=0 then
            0
        elsif h=2 then
            -x/y
        elsif h=4 then
            y/x
        elsif h=6 then
            -x/y
        else
            y/x
        endif
    endif;

f[i].f3 :=
    a[i].x * a[i].x + a[i].y * a[i].y;

应用您最喜欢的排序算法,按a按字典顺序排序f.f1, f.f2, f.f3,然后按顺序打印结果。