算法——之”字形打印矩阵

【题目】

给定一个矩阵matrix,按照“之”字形的方式打印这 个矩阵,

                 例如:1,2,3,4,5,6,7,8,9,10,11,12

                 “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11, 8,12


【要求】 额外空间复杂度为O(1)。

 

思路:

使用宏观思想,千万不要把思路限制在局部。

①设计A,B指针一开始都在(0,0)位置

②A总是向右移动,B总是向下移动,当A运动到最右,往下移动,当B运动到最下,往右移动【A、B每次都走一步】,A和B每次都可以划出一个对角线。

       

最后A、B重合,我们只需要做的就是,通过A,B两个坐标,打印出对角线上的值,而之字型打印是有顺序的【左下到右上还是右上到左下】,我们只需要认为引入一个boolean量做区分即可。

 

具体代码实现:

/**
 * 之字形打印
 */
public class ZigZagPrint {
    public void printMatrixZigZag(int[][] matrix){
        int aR = 0;
        int aC = 0;
        int bR = 0;
        int bC = 0;
        int endR = matrix.length - 1;
        int endC = matrix[0].length - 1;
        boolean fromUp = false;
        while(aR != endR + 1){
            printLevel(matrix,aR,aC,bR,bC,fromUp);
            aR = aC == endC ? aR + 1: aR;
            aC = aC == endC ? aC : aC + 1;
            bC = bR == endR ? bC + 1 : bC;
            bR = bR == endR ? bR : bR + 1;
            fromUp = !fromUp;
        }
        System.out.println();
    }

    private void printLevel(int[][] matrix, int aR, int aC, int bR, int bC, boolean fromUp) {
        if (fromUp) {
            while (aC != bC - 1) {
                System.out.print(matrix[aR++][aC--] + " ");
            }
        } else {
            while (bC != aC + 1) {
                System.out.print(matrix[bR--][bC++] + " ");
            }
        }
    }

    @Test
    public void test(){
        int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        printMatrixZigZag(matrix);
    }
}

 

### 蛇形矩阵的定义与实现 蛇形矩阵是一种特殊的二维数组结构,其元素按之字形排列填充。对于给定的正整数 \( n \),生成一个 \( n \times n \) 的矩阵,其中数字从左上角到右下角依次递增,并遵循特定的斜向填充逻辑。 以下是 Python 实现的一个方法: #### 方法描述 通过模拟填充分析可知,蛇形矩阵可以分为两种方向: 1. **向下填充**:当列索引固定时,行号逐渐增加。 2. **向上填充**:当行索引固定时,列号逐渐减少。 为了高效构建该矩阵,可以通过逐层遍历的方式完成填充操作[^1]。 ```python def generate_snake_matrix(n): matrix = [[0] * n for _ in range(n)] # 初始化 n×n 零矩阵 num = 1 # 初始值为1 row, col = 0, 0 # 当前行和列的位置 direction_down = True # 控制当前移动的方向(True表示向下) while num <= n * n: # 填充当前位置 matrix[row][col] = num num += 1 if direction_down: # 向下填充的情况 if row + 1 < n and (row + col) % 2 == 0: # 如果未越界且满足条件继续向下 row += 1 elif col + 1 < n: # 若到达边界,则转向右侧一格 col += 1 direction_down = False # 改变方向为向上 else: # 边界情况处理 break else: # 向上填充的情况 if col - 1 >= 0 and (row + col) % 2 != 0: # 如果未越界且满足条件继续向上 col -= 1 elif row + 1 < n: # 若到达边界,则转向下侧一格 row += 1 direction_down = True # 改变方向为向下 else: # 边界情况处理 break return matrix # 打印函数用于展示结果 def print_matrix(matrix): for row in matrix: print(' '.join(map(str, row))) # 测试代码 if __name__ == "__main__": n = int(input("请输入正整数n: ")) result = generate_snake_matrix(n) print_matrix(result) ``` 上述代码实现了基于蛇形路径的矩阵填充算法。它利用两个变量 `direction_down` 和 `(row + col)` 来控制填充方向的变化规律。 #### 输出示例 假设输入 \( n = 5 \),则输出如下: ``` 1 3 4 10 11 2 5 9 12 19 6 8 13 18 20 7 14 17 21 24 15 16 22 23 25 ``` 此结果展示了蛇形矩阵的特点——沿着对角线交替上下填充。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值