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大きく、終了列番号が開始列番号より大きいことが要求される.
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");
    		}
    	}
    }
}