/** * 第一题:顺时针打印二维数组 * 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--; } } }