20.時計回り印刷マトリックス(JAVA)
11794 ワード
時計回りのマトリックス
タイトルの説明
1つのマトリクスを入力、各数字を時計回りに順次印刷し、例えば、1 2 3 4 4 4 5 6 6 7 8 8 11 12 13 14 16を入力と、1,2,3,4,8,12,16,15,14,13,9,6,7,11,10の順に印刷する.
具体的な実装
問題を解く構想:主に循環の境界条件に注意しなければならない.マトリクスを一つ一つの輪と見なし、毎回左上隅から印刷され、第1の輪は(0,0)、
2周目は(1,1),3周目は(2,2)であり,ループ条件rows>start*2&&columns>start*2が得られ,
1周を印刷するには少なくとも最初のステップがあり、1行しかない場合は2番目のステップは必要ありません.
2番目のステップの前提条件は、終了行番号が開始行番号より大きいことです.
第3ステップの前提条件は、圏内に少なくとも2行の2列があることである.すなわち、終了行番号が開始行番号より大きいことを要求するほか、終了列番号が開始列番号より大きいことを求める.
同様に、印刷ステップ4の前提条件は、少なくとも3行2列であるため、終了行番号が開始行番号より少なくとも2大きく、終了列番号が開始列番号より大きいことが要求される.
タイトルの説明
1つのマトリクスを入力、各数字を時計回りに順次印刷し、例えば、1 2 3 4 4 4 5 6 6 7 8 8 11 12 13 14 16を入力と、1,2,3,4,8,12,16,15,14,13,9,6,7,11,10の順に印刷する.
具体的な実装
問題を解く構想:主に循環の境界条件に注意しなければならない.マトリクスを一つ一つの輪と見なし、毎回左上隅から印刷され、第1の輪は(0,0)、
2周目は(1,1),3周目は(2,2)であり,ループ条件rows>start*2&&columns>start*2が得られ,
1周を印刷するには少なくとも最初のステップがあり、1行しかない場合は2番目のステップは必要ありません.
2番目のステップの前提条件は、終了行番号が開始行番号より大きいことです.
第3ステップの前提条件は、圏内に少なくとも2行の2列があることである.すなわち、終了行番号が開始行番号より大きいことを要求するほか、終了列番号が開始列番号より大きいことを求める.
同様に、印刷ステップ4の前提条件は、少なくとも3行2列であるため、終了行番号が開始行番号より少なくとも2大きく、終了列番号が開始列番号より大きいことが要求される.
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> array = new ArrayList<Integer>();
public ArrayList<Integer> printMatrix(int[][] matrix) {
PrintMatrixClockwisely(matrix, matrix.length, matrix[0].length);
return array;
}
public void PrintMatrixClockwisely(int[][] numbers, int rows, int columns) {
if(numbers == null || rows <= 0 || columns <= 0) {
return ;
}
int start = 0;//start
while(rows > start * 2 && columns > start * 2) {
PrintMatrixInCircle(numbers, rows, columns, start);
++start;
}
}
public void PrintMatrixInCircle(int[][] numbers, int rows, int columns, int start) {
int endX = columns - 1 - start;//
int endY = rows - 1 - start;//
//
for(int i = start; i <= endX; ++i) {
array.add(numbers[start][i]);
//System.out.println("1");
}
//
if(start < endY) {
for(int i = start + 1; i <= endY; ++i) {
array.add(numbers[i][endX]);
//System.out.println("2");
}
}
//
if(start < endX && start < endY) {
for(int i = endX - 1; i >= start; --i) {
array.add(numbers[endY][i]);
//System.out.println("3");
}
}
//
if(start < endX && start < endY - 1) {
for(int i = endY - 1; i >= start + 1; --i) {
array.add(numbers[i][start]);
//System.out.println("4");
}
}
}
}