輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> l1= new ArrayList<>();
int i = 0 ; //代表橫座標
int j = 0 ; //代表縱座標
boolean flag1 = false ; //標誌變數,當向右方向或者向下方向時為false,當向左方向或者向上方向時為true
boolean flag2 = false ; //標誌變數,當為false時,橫座標不變縱座標移動,當為true時縱座標不變,橫座標移動
int t1 = matrix.length; //求出行數
int t2 = matrix[0].length; //求出列數
int t3 = -1 ; //標誌位
int t4 = 0 ; //標誌位
int count = t1*t2; //元素總個數
while(count > 0) { //當元素沒有新增完,就繼續新增元素
while( !flag1 ) { //向右或者向下
if(count <= 0) { //如果已經新增完就跳出
break;
}
while( !flag2) { //向右
l1.add(matrix[i][j]);
count -- ;
j ++;
if( j == t2 ) //已經把一行新增完,修改標誌變數
flag2 = true;
}
j--; //j--,把游標定位回剛剛新增元素的列號
i++; //因為對應i,j的位置已經新增過,所以把i++
t2 --; //下一次同一個方向時,新增元素的數量肯定要減一
while(flag2) {
if(count <= 0) {
break;
}
l1.add(matrix[i][j]);
count --;
i++;
if(i == t1) {
flag2 = false; //向右向下已經結束,所以把flag1標誌變數也進行修改了
flag1 = true;
}
}
t1 --;
i -- ;
j --;
}
while(flag1) {
if(count <= 0) {
break;
}
while( !flag2) {
l1.add(matrix[i][j]);
count --;
j --;
if( j == t3 )
flag2 = true;
}
j++;
t3++;
i--;
while(flag2) {
if(count <= 0) {
break;
}
l1.add(matrix[i][j]);
count --;
i--;
if(i == t4) {
flag2 = false;
flag1 = false;
}
}
j ++ ;
i++;
t4++;
}
}
return l1;
}