转圈输出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);
}