算法练习:“回”字形打印矩阵、“之字”形打印矩阵

转圈输出n*n的矩阵、进而输出 M * N 的矩阵

12

34 输出为 1243

对于任意一个矩阵,可以找到他的位于正对角线两边界的元素,

1234

5678

4329 对于这个矩阵 第一个边界元素是1 ,第二个边界元素是9。

假设 1 的坐标为 (row1,cow1)

假设 9 的坐标为 (row2,cow2)

对于任意一个矩阵,都可以

从 cow1++到 cow2 其中row不变 输出每个元素 第一行

然后 row1 ++ 到 row2 其中cow不变 输出每个元素 最后一列

然后 cow2-- 到cow1 其中row不变 输出每个元素 最后一行

row2-- 到row1 其中cow不变 输出每个元素。 第一列

当完成一次循环时,(row1++,colw1++) 如果此时没有出现 row1>=row2 则继续上面的函数输出。

代码:

public static void spiralOrderPrint1(int[][] matrix) {
	int row1 = 0;
	int  cow1= 0;
	int row2 = matrix.length - 1;
	int  cow2= matrix[0].length - 1;
	while (cow1 <= cow2 && row1 <= row2) {
		printEdge1(matrix, row1++, cow1++, row2--, cow2--);
	}
}
public static void printEdge1(int[][] m, int row1, int cow1, int row2, int cow2) 
{
	if(row1==row2)
	{
		for (int i = row1; i <= row2; i++) 
		{
			
			System.out.print(m[row1][i] + " ");
		}
	}
	else if (cow1==cow2)
	{
		for (int i = cow1; i <= cow2; i++) 
		{
			
			System.out.print(m[i][cow1] + " ");
		}
	}
	else
	{
		
		int c=cow1;
		int r=row1;
		while(c!=cow2)
		{
			System.out.println(m[row1][c]+" ");
			c++;
		}
		while(r!=row2)
		{
			System.out.println(m[r][cow2]+" ");
			r++;
		}
		while(c!=cow1)
		{
			System.out.println(m[row2][c]+" ");
			c--;
		}
		while(r!=row1)
		{
			System.out.println(m[r][cow1]+" ");
			r--;
		}
	}
	
}

矩阵按之字打印输出

在这里插入图片描述

    public static void printMatrixZigZag(int[][] matrix) {
        int row1 = 0;
        int cow1 = 0;
        int row2 = 0;
        int cow2 = 0;
        int endR = matrix.length - 1;
        //最后一行
        int endC = matrix[0].length - 1;
        //最后一列
        boolean fromUp = false;
        while (row1 != endR + 1) {
            printLevel(matrix, row1, cow1, row2, cow2, fromUp);
            row1 = cow1 == endC ? row1 + 1 : row1;
            //当 c1 到达最后一列时   r1 增加  否则不变
            cow1 = cow1 == endC ? cow1 : cow1 + 1;
            // 当 c1 到达最后一列时    c1++   否则不变
            cow2 = row2 == endR ? cow2 + 1 : cow2;
            // 当 row2 到达最后一行时   c2不变   否则 c2++
            row2 = row2 == endR ? row2 : row2 + 1;
            // 当 row2 到达最后一行时  row++  否则不变
            fromUp = !fromUp;
        }
        System.out.println();
    }

    public static void printLevel(int[][] m, int row1, int cow1, int row2, int cow2,
                                  boolean f) {
        if (f) {
            while (row1 <= row2 ) {
                System.out.print(m[row1++][cow1--] + " ");
                //上往下打印
            }
        } else {
            while (row2 != row1 - 1) {
            //需要注意判定条件   如果为 row2!=row1 输出的矩阵中  因为在遍历到最右上角的位置前已经跳出循环,所以最右上角的位置不会输出
                System.out.print(m[row2--][cow2++] + " ");
                //下往上打印
            }
        }
    }

    public static void main(String[] args) {
        int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
        printMatrixZigZag(matrix);

    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值