【题目】
给定一个整型矩阵matrix,请按照转圈的方式打印它。
例如:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
打印结果为:
1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
【要求】
额外空间复杂度为O(1)
【代码】
public static void main(String[] args) {
int[][] m={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
spiraOrderPrint(m);//1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
}
//转圈打印矩阵
public static void spiraOrderPrint(int[][] matrix){
int tR=0;
int tC=0;//左上角坐标(0,0)
int dR=matrix.length-1;
int dC=matrix[0].length-1;//右下角坐标,如(3,3)
while(tR<=dR && tC<=dC){//如果左上角坐标跑到右下角坐标下方或右方,转圈打印停止
printEdge(matrix,tR++,tC++,dR--,dC--);//外层打印完成,开始打印里面一层
}
}
//矩阵分圈处理
private static void printEdge(int[][] matrix, int tR, int tC, int dR, int dC) {
if(tR==dR){//矩阵只有一行
for(int i=tC;i<=dC;i++){
System.out.print(matrix[tR][i]+" ");
}
}
else if(tC==dC){//矩阵只有一列
for(int i=tR;i<=dR;i++){
System.out.print(matrix[i][tC]+" ");
}
}
else{//一般情况
int curC=tC;
int curR=tR;
while(curC!=dC){//打印矩阵圈上行
System.out.print(matrix[tR][curC]+" ");
curC++;
}
while(curR!=dR){//打印矩阵圈右列
System.out.print(matrix[curR][dC]+" ");
curR++;
}
while(curC!=tC){//打印矩阵圈下行
System.out.print(matrix[dR][curC]+" ");
curC--;
}
while(curR!=tR){//打印矩阵圈左列
System.out.print(matrix[curR][tC]+" ");
curR--;
}
}
}