题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
package swordRefersToOffer;
import java.util.Scanner;
public class PrintMatrix {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int [][] arr = new int[n][n];
//给数组赋值
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
arr[i][j]=sc.nextInt();
}
}
//将数组的值输出
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
System.out.print(arr[i][j]+"\t");
if(j == n-1){
System.out.println();
}
}
}
System.out.println("顺时针打印请输入数组的值");
printMatr(arr);
}
public static void printMatr(int[][] arr){
int tr = 0;
int tc = 0;
int dr = arr.length-1;
int dc = arr[0].length-1;
while (tr <= dr && tc <= dc){
printEdge(arr,tr++,tc++,dr--,dc--);
}
}
public static void printEdge(int[][] arr,int tr, int tc, int dr, int dc){
if(tr == dr){//只有一行
for(int i =tc;i<dc;i++){
System.out.print(arr[tr][i]+" ");
}
}else if(tc==dc){//只有一列
for(int i =tr;i<dr;i++){
System.out.print(arr[i][tr]+" ");
}
}else{
int c = tc;
int r = tr;
while(c != dc){
System.out.print(arr[tr][c]+" ");
c++;
}
while(r != dr){
System.out.print(arr[r][dc]+" ");
r++;
}
while(c != tc){
System.out.print(arr[dr][c]+" ");
c--;
}
while(r != tr){
System.out.print(arr[r][tc]+" ");
r--;
}
}
}
}
思想:用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。