题目
【剑指offer,面试题20】题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。
思路
看着比较简单的一道题目,但是想起来比较费劲,剑指offer上面的解题过程没看懂,以下思路借鉴自【算法06】顺时针打印矩阵
首先矩阵不一定是方阵,所以按照对角线的思路是不可行的
一个矩阵,给定起点(startX,startY)和终点(endX,endY)(即位于对角线上的两个点)就可以打印一周,然后向里进一周(即++startX,++startY,–endX,–endY)即可,如果起始点坐标<终止点坐标(即startX < endX 或者 startY < endY)循环结束。
给定起点和终点,打印一圈的结束条件是什么?我画了三种情况的矩阵4×4矩阵,3×5矩阵,5×3矩阵(所有矩阵无非就这三种类型,正方形的,偏“胖”的,偏“瘦”的),很快发现,只有三种情况:一直循环到结束,或者只剩下一行,或者只剩下一列。所以我们的函数首先判定:只有一行?打印该行;只有一列,打印该列。都不是,打印四条边上的数字。(如果有两行就可以打印一圈,两列也可以打印一圈)
题目的java实现
package com.cn;
import java.util.Scanner;
public class Matrix {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//输入矩阵的行数
int row = sc.nextInt();
//输入矩阵的列数
int column = sc.nextInt();
int[][] a = new int[row][column];
//输入矩阵
for(int i = 0; i < row; i++ ){
for(int j = 0; j < column; j++){
a[i][j] = sc.nextInt();
}
}
PrintMatrix(a,row,column);
}
public static void PrintMatrix(int[][] a, int row, int column){
//定义起始点下标
int startX = 0;
int startY = 0;
//定义终点下标
int endX = row -1;
int endY = column - 1;
while(true){
if(startX > endX || startY > endY){
break;
}
PrintMatrixCircle(a,startX,startY,endX,endY);
startX++;
startY++;
endX--;
endY--;
}
}
public static void PrintMatrixCircle(int [][]a, int startX, int startY, int endX, int endY){
//打印一行
if(startX == endX){
for(int i = startY; i <= endY; i++){
System.out.print(a[startX][i] + " ");
}
}
//打印一列
if(startY == endY){
for(int j = startX; j<=endX;j++){
System.out.print(a[j][startY] + " ");
}
}
//打印一圈
for(int p = startY; p < endY; p++){
System.out.print(a[startX][p] + " ");
}
for(int q = startX; q < endX; q++){
System.out.print(a[q][endY] + " ");
}
for(int m = endY; m > startY; m--){
System.out.print(a[endX][m] + " ");
}
for(int n = endX; n > startX; n--){
System.out.print(a[n][startY] + " ");
}
}
}