public class Main {
/*****************************************************************************************/
//顺时针打印矩阵
public static ArrayList<Integer> printMatrix(int[][] matrix) {
int lr = 0; //左上角的行号
int lc = 0; //左上角的列号
int rr = matrix.length - 1;//右下角的行号
int rc = matrix[0].length - 1; //右下角的列号
ArrayList<Integer> list = new ArrayList<Integer>();
while(lr <= rr && lc <= rc) {
//一次打印一圈
printMatrix(matrix, lr++, lc++, rr--, rc--, list);
}
return list;
}
public static void printMatrix(int[][] matrix, int lr, int lc, int rr, int rc, ArrayList<Integer> list) {
//如果是只有一行
if(lr == rr) {
for(int i = lc; i <= rc; i++) {
//System.out.print(matrix[lr][i] + " ");
list.add(matrix[lr][i]);
}
}
//如果是只有一列
else if(rc == lc) {
for(int i = lr; i <= rr; i++) {
list.add(matrix[i][lc]);
// System.out.print(matrix[i][lc] + " ");
}
}
//二维数组
else {
int curR = lr; //把左边的行记住
int curC = lc; //把左边的列记住
//打印上面的行 1 2 3
while(curC != rc) {
list.add(matrix[lr][curC]);
// System.out.print(matrix[lr][curC] + " ");
curC++;
}
//打印右边的列 4 8 12
while(curR != rr) {
list.add(matrix[curR][rc]);
// System.out.print(matrix[curR][rc] + " ");
curR++;
}
//打印下面的行 16 15 14 此时 curC 已经跑到了最右边的列了
while(curC != lc) {
list.add(matrix[rr][curC]);
// System.out.print(matrix[rr][curC] + " ");
curC--;
}
//打印左边的列 13 9 5 同理 curR 已经跑到了最后一行
while(curR != lr) {
list.add(matrix[curR][lc]);
// System.out.print(matrix[curR][lc] + " ");
curR--;
}
//此时一圈打印完毕 进行下一圈
}
}
/*****************************************************************************************/
// 正方形数组 顺时针旋转 90°
//找到4个点相互交换
public static void rotate(int[][] matrix) {
int lr = 0; //左上角的行号
int lc = 0; //左上角的列号
int rr = matrix.length - 1;//右下角的行号
int rc = matrix[0].length - 1; //右下角的列号
while(lc <= rc) {
//一次打印一圈
rotate(matrix, lr++, lc++, rr--, rc--);
}
}
public static void rotate(int[][] matrix, int lr, int lc, int rr, int rc) {
int times = rc - lc;
int temp = 0;
for(int i =0; i != times; i++) {
//交换四个点
temp = matrix[lr][lc + i];
//左上角的点 = 左下角的点
matrix[lr][lc + i] = matrix[rr - i][lc];
//左下角的点 = 右下角的点
matrix[rr - i][lc] = matrix[rr][rc - i];
//右下角的点 = 右上角的点
matrix[rr][rc - i] = matrix[lr + i][rc];
matrix[lr + i][rc] = temp;
}
}
public static void main(String[] args) {
int [][] matrix =
{{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}};
System.out.println( "旋转打印数组:");
System.out.println("1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10");
System.out.println(printMatrix(matrix));
System.out.println("正方形数组旋转 90°");
rotate(matrix);
System.out.println(printMatrix(matrix));
}
}