发布时间:2025-12-09 11:59:22 浏览次数:1
import cv2 as cv ''' define : zigzag 扫描 input : 二维矩阵, shape: (row, col) output : 列表, shape: (row*col,) variable: k 列表序号, i 行序号, j 列序号, row 行数, col 列数 method : 假设 (0, 0) 在左上角, (row-1, col-1) 在右下角的情况. 考虑非边界的情况, 只有右上/左下两个方向. 以从 (0, 0) 先向右(下)为例, 则会有 i+j 为偶数时右上(左下)前进, 为奇数时左下(右上)的情况前进. 如果遇到边界, 某个方向收到限制, 移动允许的直线方向'''def zigzag(data): row = data.shape[0] col = data.shape[1] num = row * col list = np.zeros(num,) k = 0 i = 0 j = 0 while i < row and j < col and k < num: list[k] = data.item(i, j) k = k + 1 # i + j 为偶数, 右上移动. 下面情况是可以合并的, 但是为了方便理解, 分开写 if (i + j) % 2 == 0: # 右边界超出, 则向下 if (i-1) in range(row) and (j+1) not in range(col): i = i + 1 # 上边界超出, 则向右 elif (i-1) not in range(row) and (j+1) in range(col): j = j + 1 # 上右边界都超出, 即处于右上顶点的位置, 则向下 elif (i-1) not in range(row) and (j+1) not in range(col): i = i + 1 else: i = i - 1 j = j + 1 # i + j 为奇数, 左下移动 elif (i + j) % 2 == 1: # 左边界超出, 则向下 if (i+1) in range(row) and (j-1) not in range(col): i = i + 1 # 下边界超出, 则向右 elif (i+1) not in range(row) and (j-1) in range(col): j = j + 1 # 左下边界都超出, 即处于左下顶点的位置, 则向右 elif (i+1) not in range(row) and (j-1) not in range(col): j = j + 1 else: i = i + 1 j = j - 1 return list if __name__ == "__main__": data = np.matrix([[1,2,6],[3,5,7],[4,8,9]]) print(data) result = zigzag(data) print(result)