【蓝桥杯】顺时针打印二维数组
题目说明:
| 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 |
分析:
顺时针打印,可以理解为一圈一圈打印数组。可以从外圈先入手,最后在用循环控制其他圈。
每一圈分为上下左右四个边,变化的是行和列。
先确定边界左上角和右下角。
说明:定义 r, c的意义:在写到输出下边的时候发现leftUpRow ,leftUpCol 刚一直在变化;
现在要使用leftUpRow ,leftUpCol当作边界,发现都被改变了,不是原来的值了。所以赋值给新的变量。
上边:行不变,列在变。边界是c <= RightDownCol 。
在这需要注意的是列在++完已经超过RightDownCol。需要将其恢复到RightDownCol,以便做右边的操作;
右边:行在变,列不变。此处要将行+1,在进行循环输出操作。
下边和左边一次类推。
代码如下:(完整版,可AC)
1 public class case1 { 2 3 public static void main(String[] args) { 5 int arr[][] = { 6 { 1, 2, 3, 4 }, 7 { 5, 6, 7, 8 }, 8 { 9, 10, 11, 12 }, 9 { 13, 14, 15, 16 } 10 }; 11 print(arr); 12 } 13 14 // 顺时针打印数组 15 static void print(int[][] matrix) { 16 17 int leftUpRow = 0, leftUpCol = 0; 18 int RightDownRow = matrix.length - 1, 19 RightDownCol = matrix[0].length - 1; 20 21 while (leftUpRow <= RightDownRow && leftUpCol <= RightDownCol) { 23 int r = leftUpRow; 24 int c = leftUpCol; 25 26 // 上边一条边; 27 while (c <= RightDownCol) { 28 System.out.print(matrix[r][c++] + " "); 29 } 30 // 恢复System.out.println(c);//c=4 31 c = RightDownCol; 32 // System.out.println(r);//r=0 33 r++; 34 // 右边 35 while (r <= RightDownRow) { 36 System.out.print(matrix[r++][c] + " "); 37 } 38 39 r = RightDownRow; 40 c--; 41 42 // 下边 43 while (c >= leftUpCol) { 44 System.out.print(matrix[r][c--] + " "); 45 } 46 47 // 恢复 48 c = leftUpCol; 49 r--; 50 // 左边 51 while (r > leftUpRow) { 52 System.out.print(matrix[r--][c] + " "); 53 } 54 55 leftUpRow++; 56 leftUpCol++; 57 RightDownCol--; 58 RightDownRow--; 59 60 } 61 62 } 63 64 } 65
持续更新中……
浙公网安备 33010602011771号