- public static void main(String[] args) {
- //调用方法,获取数组并打印
- printMetirx(getMetirx(4));
- }
- // 打印数组的方法
- public static void printMetirx(int[][] metirx) {
- // 二维数组实际上外层是一个数组的数组,元素是int[]数组
- // 循环访问外层数组的元素
- for (int i = 0; i < metirx.length; i++) {
- // 访问到的外层数组的元素:int[]数组
- // 在循环访问内层数组
- for (int j = 0; j < metirx[i].length; j++) {
- // 打印对应元素
- System.out.print(metirx[i][j]);
- // 添加空格
- System.out.print("\t\t");
- }
- // 外层数组的元素单独显示一行,即一个int[]数组显示在一行
- System.out.print('\n');
- }
- }
- /**
- * @param n 二维数组的大小
- * @return int[n][n] 返回一个螺旋矩阵
- *
- * @author 思路:按“口”字形赋值,先给最外层一圈赋值,再给第二圈赋值....直至结束。
- * 用上下左右四个顶点的位置来确定“口”的大小。
- * 每次赋值完成一条边,对应的顶点往中心靠拢。
- */
- public static int[][] getMetirx(int n) {
- // 创建二维数组
- int[][] metirx = new int[n][n];
- // 赋值圈数
- int count = (n + 1) / 2;
- // 起始数
- int start = 1;
- // “口”字形圈的四个顶点
- int left = 0, right = n - 1, top = 0, botton = n - 1;
- // 赋值次数,即圈数
- for (int i = 0; i < count; i++) {
- // 给上边缘赋值,从左往右
- for (int x = left; x <= right; x++) {
- metirx[top][x] = start++;
- }
- // 上顶点往下移
- top++;
- // 给右边缘赋值,从上往下
- for (int y = top; y <= botton; y++) {
- metirx[y][right] = start++;
- }
- // 右顶点往左移
- right--;
- // 给下边缘赋值,从右往左
- for (int x = right; x >= left; x--) {
- metirx[botton][x] = start++;
- }
- // 下顶点往上移
- botton--;
- // 给左边缘复制,从下往上
- for (int y = botton; y >= top; y--) {
- metirx[y][left] = start++;
- }
- // 左顶点往右移
- left++;
- }
- // 返回赋值完成的二维矩阵
- return metirx;
- }
复制代码 |