A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 遇见未来2016 中级黑马   /  2016-5-28 08:48  /  587 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
                如: n = 4 则打印:

1 个回复

倒序浏览
  1. public static void main(String[] args) {
  2.                 //调用方法,获取数组并打印
  3.                 printMetirx(getMetirx(4));

  4.         }

  5.         // 打印数组的方法
  6.         public static void printMetirx(int[][] metirx) {
  7.                 // 二维数组实际上外层是一个数组的数组,元素是int[]数组
  8.                 // 循环访问外层数组的元素
  9.                 for (int i = 0; i < metirx.length; i++) {
  10.                         // 访问到的外层数组的元素:int[]数组
  11.                         // 在循环访问内层数组
  12.                         for (int j = 0; j < metirx[i].length; j++) {
  13.                                 // 打印对应元素
  14.                                 System.out.print(metirx[i][j]);
  15.                                 // 添加空格
  16.                                 System.out.print("\t\t");
  17.                         }
  18.                         // 外层数组的元素单独显示一行,即一个int[]数组显示在一行
  19.                         System.out.print('\n');
  20.                 }
  21.         }

  22.         /**
  23.          * @param n 二维数组的大小
  24.          * @return int[n][n] 返回一个螺旋矩阵
  25.          *
  26.          * @author   思路:按“口”字形赋值,先给最外层一圈赋值,再给第二圈赋值....直至结束。
  27.          *                           用上下左右四个顶点的位置来确定“口”的大小。
  28.          *           每次赋值完成一条边,对应的顶点往中心靠拢。
  29.          */
  30.         public static int[][] getMetirx(int n) {
  31.                 // 创建二维数组
  32.                 int[][] metirx = new int[n][n];
  33.                 // 赋值圈数
  34.                 int count = (n + 1) / 2;
  35.                 // 起始数
  36.                 int start = 1;
  37.                 // “口”字形圈的四个顶点
  38.                 int left = 0, right = n - 1, top = 0, botton = n - 1;
  39.                 // 赋值次数,即圈数
  40.                 for (int i = 0; i < count; i++) {
  41.                         // 给上边缘赋值,从左往右
  42.                         for (int x = left; x <= right; x++) {
  43.                                 metirx[top][x] = start++;
  44.                         }
  45.                         // 上顶点往下移
  46.                         top++;
  47.                         // 给右边缘赋值,从上往下
  48.                         for (int y = top; y <= botton; y++) {
  49.                                 metirx[y][right] = start++;
  50.                         }
  51.                         // 右顶点往左移
  52.                         right--;
  53.                         // 给下边缘赋值,从右往左
  54.                         for (int x = right; x >= left; x--) {
  55.                                 metirx[botton][x] = start++;
  56.                         }
  57.                         // 下顶点往上移
  58.                         botton--;
  59.                         // 给左边缘复制,从下往上
  60.                         for (int y = botton; y >= top; y--) {
  61.                                 metirx[y][left] = start++;
  62.                         }
  63.                         // 左顶点往右移
  64.                         left++;
  65.                 }
  66.                 // 返回赋值完成的二维矩阵
  67.                 return metirx;
  68.         }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马