转圈打印矩阵

【题目】 给定一个整型矩阵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 class PrintMatrixSpiralOrder {
public static void main(String[] args) {
int arr[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
print(arr);
System.out.println("=================================");
rotate(arr);
}

public static void rotate(int matrix[][]){
int tr = 0; //起点的行坐标。
int tc = 0; // 起点的纵坐标。
int dr = matrix.length-1; //右下角元素的行坐标。
int dc = matrix[0].length-1; //右下角元素的纵坐标。
while (tr<=dr){ //判断跳出循环的条件,相当于层。用tc和dc易可。
rotatePrint(matrix,tr++,tc++,dr--,dc--);
}
}
//每一层的打印方法
//分三种情况:
//1,只有一行
//2,只有一列
//3,其序情况。
public static void rotatePrint(int martix[][],int tr,int tc, int dr,int dc){
if(tr==dr){ //第一种情况。
for (int i=tc;i<=dc;i++){
System.out.print(martix[tr][i]+" ");
}
}else if(tc==dc){ //第二种情况
for (int i=tr;i<=dr;i++){
System.out.print(martix[i][tc]+" ");
}
}else { //设置一个变量,从起点,转圈旋转到起点。
int curR = tr;
int curC = tc;
while (curC!=dc){ //四个where为转圈打印。
System.out.print(martix[tr][curC]+" ");
curC++;
}
while (curR!=dr){
System.out.print(martix[curR][dc]+" ");
curR++;
}
while (curC!=tc){
System.out.print(martix[dr][curC]+" ");
curC--;
}
while (curR!=tr){
System.out.print(martix[curR][tc]+" ");
curR--;
}
}
}
public static void print(int arr[][]){
for (int i =0;i<arr.length;i++){
for (int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
总结:按层打印,确定边界条件。

猜你喜欢

转载自www.cnblogs.com/liuwentao/p/9365346.html
今日推荐