您的位置:首页 > 编程语言 > Java开发

矩阵的“之”字形打印

2017-12-05 00:00 190 查看
题目:给定一个矩阵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)

Solution:

按照如下方式打印即可:


先输出(0,0)的值,然后设定两个方向。一个从(0,0)开始向右,遇到边界就向下;另一个从(0,0)向下,遇到边界就向右。两者同时进行。然后设定一个bool变量flag, true表示从右上往坐下输出,false表示左下往右上输出(也可以相反)。

具体代码如下:

public class Main {
public static final int N = 5;
public static final int MAX = 10;
public static void main(String[] args) {
int[][] m = new int[(int)(Math.random() * N + 1)][(int)(Math.random() * N + 1)];//矩阵大小随机

for (int i = 0; i < m.length; i++) { //矩阵中元素的值随机
for (int j = 0; j < m[i].length; j++) {
m[i][j] = (int)(Math.random() * MAX);
}
}
println(m);
printZ(m);
}

public static void printZ(int[][] m) { //矩阵“之”字形打印
System.out.print(m[0][0]);
int i = 0, j = 0;
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
boolean flag = false;
while(!(x1 == x2 && x1 == m.length - 1)) {
if (i++ < m[0].length - 1) {
y1 = i;
} else {
y1 = m[0].length - 1;
x1++;
}
if (j++ < m.length - 1) {
x2 = j;
} else {
y2++;
x2 = m.length - 1;
}
flag = flag ? false : true;
help(m, x1, y1, x2, y2, flag);
}
}

public static void help(int[][]m, int x1, int y1, int x2, int y2, boolean flag) {
if (flag) {
for (int i = x1; i <= x2; i++) {
System.out.print(" " + m[i][y1--]);
}
} else {
for (int i = x2; i >= x1; i--) {
System.out.print(" " + m[i][y2++]);
}
}
}

public static void println(int[][] m) { //输出矩阵的元素
for (int i = 0; i < m.length; i++) {
System.out.print(m[i][0]);
for (int j = 1; j < m[i].length; j++) {
System.out.print(" " + m[i][j]);
}
System.out.println();
}
System.out.println();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 矩阵