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
}
?
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
}
回复中代码段贴上去好像有问题,会自动被删除字符?
复制后:if (a_index1)
尖括号加转义
ZigZag遍历任意二维数组
https://www.autoahk.com/?p=40109
觉得这个代码比上次的那个要完善精简许多,上次代码可能还是错误的!
欢迎指点~