转载来源:https://blog.csdn.net/qq_40409115/article/details/80503624
顺时针打印矩阵,输入一个矩阵,按照从外向里逆时针的顺序打印出每一个数字。
如
输入: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
首先我们观察 4 × 4的矩阵
再观察 5 × 5的矩阵
由此我们可以观察出让循环继续进行的条件是:
矩阵的行数>当前的圈数×2且同时要满足矩阵的列数>当前的圈数×2.
import java.util.ArrayList;
public class MyReversePrint
{
public static void main(String[] args)
{
int[][] array =
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
ArrayList<Integer> printList = new ArrayList<Integer>();
printList = reversePrint(array);
for (int i = 0; i < printList.size(); i++)
{
System.out.print(printList.get(i) + "\0");
}
}
public static ArrayList<Integer> reversePrint(int[][] array)
{
// 二位数组(矩阵)的行数
int rows = array.length;
// 二位数组(矩阵)的列数
int columns = array[0].length;
ArrayList<Integer> myList = new ArrayList<Integer>();
// start表示圈数,从第0圈开始计数,没走一圈 圈数+1
int start = 0;
//让循环继续进行的条件是:矩阵的行数>当前的圈数×2且同时要满足矩阵的列数>当前的圈数×2.
while (rows > start * 2 && columns > start * 2)
{
//记录每圈最后一行的下标
int endRow = rows - 1 - start;
//记录没圈最后一列的下标
int endColumn = columns - 1 - start;
//一圈圈逆序遍历数组中的元素,并插入到myList中
//1.从左到右
for (int i = start; i <= endColumn; i++)
myList.add(array[start][i]);
//2.从上到下
if (endRow > start)
{
for (int i = start + 1; i <= endRow; i++)
myList.add(array[i][endColumn]);
}
//3.从右到左
if (endRow > start && endColumn > start)
{
for (int i = endColumn - 1; i >= start; i--)
myList.add(array[endRow][i]);
}
//4.从下到上
if (endRow >= start + 2 && endColumn > start)
{
for (int i = endRow - 1; i > start; i--)
myList.add(array[i][start]);
}
//圈数自增
start++;
}
return myList;
}
}