/**
* 第一题:顺时针打印二维数组
* 1 2 3 4
* 5 6 7 8
* 9 10 11 12
* 13 14 15 16
*
* 1 2 3 4 8 12 16 ~~~
*
* 第一行 1~4列,然后第4列 1~4行,然后第四行,4~1列,第一列 4~2行
* 所以打印一圈的实现可以分为4步:
* 第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列
*
* 第一圈左上角(0,0) 第二圈左上角(1,1)可以看出来 左上角的行列坐标相同,
* 所以可以通过 左上角(leftUpRow,leftUpCol) 和
* 右下角 (rightDownRow,rightDownCol)作为突破点
* 通过一个动点C 从左上角开始顺时针移动进行遍历
*
*
*/
public class TwoArraysTest01 {
public static void main(String[] args) {
TwoArraysTest01 twoArraysTest01 = new TwoArraysTest01();
int [][]matrix = new int[4][4];
int temp = 0 ;
for (int[] ints : matrix) {
for (int i = 0; i < ints.length; i++) {
ints[i] = temp+1;
temp++;
}
}
twoArraysTest01.print(matrix);
// for (int[] ints : matrix) {
// for (int anInt : ints) {
// System.out.print(anInt+"\t");
// }
// System.out.println();
// }
}
public void print(int [][] matrix){
// 每圈左上角的点
int leftUpRow = 0,leftUpCol = 0;
// 每圈右下角的点(这里-1 是因为索引从0开始的 左上角为0,0 )
int rightDownRow = matrix.length-1,rightDownCol = matrix[0].length-1;
int row=leftUpRow,col=leftUpCol;
// 当左上角和右下角坐标互换时 跳出循环
while ( !(row == rightDownRow && col ==rightDownCol) ){
// 定义动点C(上面两点作为边界 移动c点进行遍历 )
row= leftUpRow;
col = leftUpCol;
// 输出矩阵的上边
// 当左上边的列坐标 <= 右下角的列坐标 就打印该行
while (col <= rightDownCol){
System.out.print(matrix[row][col++] +"\t");
}
// 当退出上面循环时leftUpCol > rightDownCol
// [1 2 3 4 x(此时在这) ]要恢复到4的位置,然后向下走
col = rightDownCol;
row++;
// 此时 动点 在 8 这里
// 打印右侧一条边
// 如果左上角的行数小于右下角的行数 就打印在一列
while (row <= rightDownRow){
System.out.print(matrix[row++][col]+"\t");
}
row = rightDownRow;
col--;
// 此时动点在 15 这里
// 输出下面这条边
while (col >= leftUpCol){
System.out.print(matrix[row][col--]+"\t");
}
col = 0;
row--;
// 输出左边这条边
while (row > leftUpRow){
System.out.print(matrix[row--][col]+"\t");
}
// 此时第一圈结束 动点停留在左上角 1 处
// 此时圈开始缩小 左上角和右下角变成 6 和 11 进入下一圈 进行打印
leftUpCol++;
leftUpRow++;
rightDownCol--;
rightDownRow--;
}
}
}
算法练习题(七)——顺时针打印二维数组
最新推荐文章于 2021-06-18 15:54:39 发布