[第1000关] ZigZag遍历二维数组

ZigZag 是用在图像压缩中的一个算法

对于任意二维数组 ar[x_max][y_max]

按照下面的顺序遍历

算法思路:

1、对角线数=行数+列数-1

2、在对角线进行遍历

#include <log4ahk> ;https://www.autoahk.com/archives/36659
x_max := 5
y_max := 5
ar := create_matrix(5, 5)
log.info(ar)
;![](https://raw.githubusercontent.com/kazhafeizhale/pic/master/20220215204703.png)
;遍历数组
rtn_array := []

num_bias := x_max + y_max - 1
i := 1 ;当前行
j := 1 ;当前列
loop,% num_bias
{
    if(Mod(A_Index - 1, 2) == 0) ;偶数  左上遍历
    {
        while(i > 0 && j < y_max + 1)
        {
            rtn_array.Push(ar[i][j])
            i--
            j++
        }
        i++
        if(j > y_max)
        {
            i++
            j--
        }
    }
    else ;奇数
    {
        while(j > 0 && i < x_max + 1)
        {
            rtn_array.Push(ar[i][j])
            i++
            j--
        }
        j++
        if(i > x_max)
        {
            i--
            j++
        }
    }
}
log.info(rtn_array)

;输入行数和列数生成一个2维矩阵,并填充
;x 行数
;y 列数
create_matrix(x, y)
{
    array := []
    index := 1
    loop,% x
    {
        i := A_Index
        array.Push([])
        loop,% y
        {
            j :=  A_Index
            array[i][j] := index++
        }
    }
    return array
}

 

给TA捐赠
共{{data.count}}人
人已捐赠
AHKV1学习

AutoHotkey数据类型详解

2022-2-15 16:31:55

其他

[第十关]21游戏

2022-2-16 9:00:32

6 条回复 A文章作者 M管理员
  1. ilaoyao

    ZigZag遍历任意二维数组

    https://www.autoahk.com/?p=40109

    觉得这个代码比上次的那个要完善精简许多,上次代码可能还是错误的!

    欢迎指点~

  2. ilaoyao

    回复中代码段贴上去好像有问题,会自动被删除字符?

    复制后:if (a_index1)

    • 1河许人

      尖括号加转义

  3. ilaoyao

    global ar:=object()
    a:=”6″ ;行
    b:=”6″ ;列
    c:=a+b-1
    make_array(a,b)
    tmp:=ar[1,1] . “|”

    loop, % c
    {
    if (a_index1)
    {
    sn1:=a_index
    sn2:=a_index+1
    loop, % sn1
    {
    if (mod(sn1,2)=1) ;奇数
    {
    tmp.=ar[a_index, sn2-a_index] . “|”
    }
    else
    {
    tmp.=ar[sn2-a_index, a_index] . “|”
    }
    }
    }
    else if (a_index>b)
    {
    sn1:=c-a_index+1
    sn2:=a_index+1

    loop, % sn1
    {
    if (mod(sn1,2)=1) ;奇数从自身开始
    {
    tmp.=ar[b+1-a_index, sn2-(b+1-a_index)] . “|”
    }
    else
    {
    tmp.=ar[sn2-(b+1-a_index), b+1-a_index] . “|”
    }
    }

    }

    }

    msgbox, % tmp ;对结果未做二次处理,仅保存读取数据。
    return

    ;创建一个数组
    make_array(x,y)
    {
    loop, % x
    {
    a:=A_Index
    loop, % y
    {
    ar[a,A_index]:=a+(A_index-1)*y
    }
    }
    return, % ar
    }

  4. 1河许人
    1河许人给您打赏了¥2
  5. 1河许人

    👍

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索