述べたように、マトリックス印刷時計回り。例えば、入力行列:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
連続して印刷:1 2 4 8,121,615,141,395,671,110
問題解決のアイデア:時計回りの印刷、この行列は1つの引き分けで始まる、円、ライン連隊として考えられ、その回線グループをロールアップされ、そうではありませんか?
ことは有名ではないアルゴリズムの転がりボールまあ!!
はい、最初の印刷1234、および新しい行列に行列をロールオーバー:
8 12 16
7 11 15
9 10 14
5 9 13
その後、第二の印刷81216、および新しい行列に行列をロールオーバー:
15 14 13
11 10 9
7 9 5
だから、友人ああ、作業を開始しました:
/**
* @description: 顺时针打印一个矩阵
* 例如输入矩阵:
* 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
* @author: JandMin
* @create: 2019-05-24 09:26
**/
public class ClockwisePrintMatrix {
public static void main(String[] args) {
int n = 6;
int m = 7;
int[][] matrix = getMatrix(n ,m);
print(matrix);
System.out.println("==========================");
printClockwise(n,m,matrix);
}
/**
* 顺时针打印
* @param n 外层数组得长度
* @param m 里层数组得长度
* @param array 目标数组
*/
private static void printClockwise(int n,int m,int[][] array){
for(int j=0; j<m; j++){
print(array[0][j]);
}
int[][] newArray = reverse(n,m,array);
if(null == newArray || newArray.length <= 0){
return;
}
printClockwise(newArray.length,newArray[0].length,newArray);
}
/**
* 数组顺时针转90度,并且去掉第一个里层数组,变成一个新的数组
* @param n 外层数组得长度
* @param m 里层数组得长度
* @param array 目标数组
* @return
*/
private static int[][] reverse(int n,int m,int[][] array) {
if(n <=1){
return null;
}
int[][] newArray = new int[m][n-1];
int x = 0;
int y = 0;
for(int j=m-1; j>=0; j--){
for(int i=1; i<n; i++){
newArray[x][y++] = array[i][j];
}
x++;
y = 0;
}
return newArray;
}
/**
* 从1开始获取二维数组
* @param n 外层数组得长度
* @param m 里层数组得长度
* @return
*/
public static int[][] getMatrix(int n,int m){
int[][] matrix = new int[n][m];
int k = 1;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++) {
matrix[i][j] = k++;
}
}
return matrix;
}
private static void print(int[][] array){
for(int i=0; i<array.length; i++){
for(int j=0; j<array[i].length; j++){
print(array[i][j]);
}
System.out.println();
}
}
private static void print(int num){
System.out.print(num);
if(num < 10){
System.out.print(" ");
} else {
System.out.print(" ");
}
}
}
次のように実行結果は以下のとおりです。
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35
36 37 38 39 40 41 42
======== ==================
1 2 3 4 5 6 7 14 21 28 35 42 41 40 39 38 37 36 29 22 15 8 9 10 11 12 13 20 27 34 33 32 31 30 23 16 17 18 19 26 25 24
もちろん、多くのソリューションは、よりシンプルになりますがあり、歓迎ダニエルはエラーを指摘し、またはコメントは、交換をより多くのソリューションを掲載しました!!
問題より====== ========方法