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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
1   2    3    4
12 13  14   5
11  16  15   6
10  9    8    7

实在是想不出来该怎么弄, 请大神帮忙

1 个回复

倒序浏览
额 ,这个也是我的入学测试题!贴出来我的给你参考下吧!
  1. package com.itheima;

  2. /**
  3. * 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
  4. * 1        2        3        4
  5. * 12        13        14        5
  6. * 11        16        15        6
  7. * 10         9        8         7
  8. *
  9. *思路:
  10. *1.定义一个二维数组,请arr用来接收要打印的数据
  11. *2.打印该螺旋方式,可以将螺旋看成是多次循环,每次循环的开始位置都是a[0][0]  a[1][1] a[2][2]...
  12. *3.只需根据给定的n的值确定循环次数即可,循环次数为(n+1)/2
  13. *4.另外需要确定每次开始位置的值,随后按照螺旋顺序让对应角标值递增即可
  14. *5.遍历数组并按要求打印
  15. *
  16. *
  17. */
  18. public class Test9 {

  19.         public static void main(String[] args) {
  20.                
  21.                 //定义变量n用来表示需要打印的数组的大小
  22.                 int n = 15;
  23.                
  24.                 //定义print()方法,用来完成数组内容的确定并打印
  25.                 print(n);
  26.         }

  27.         public static void print(int n) {
  28.                
  29.                 //定义一个int型数组,用来接收需要打印的数据
  30.                 int[][] arr = new int[n][n];
  31.                
  32.                 //定义int型变量count,用来表示螺旋数组循环的次数
  33.                 int count = (n + 1) / 2;
  34.                
  35.                 //确定每个循环开始出的初始值a[0][0] a[1][1] a[2][2]...
  36.                 arr[0][0] = 1;
  37.                 for (int i = 1; i < count; i++) {
  38.                         arr[i][i] = arr[i - 1][i - 1] + ((n - (i - 1) * 2) * 2 - 2) * 2;
  39.                 }
  40.                
  41.                 //使用for循环,依次循环确定每次回环上的对应角标的值
  42.                 for (int i = 0; i < count; i++) {
  43.                        
  44.                         //该循环用于确定每次回环上上边缘数据
  45.                         for (int j = i + 1; j < arr.length - i; j++) {
  46.                                 arr[i][j] = arr[i][j - 1] + 1;
  47.                         }
  48.                        
  49.                         //该循环用于确定每次回环上右边缘的数据
  50.                         for (int j = i + 1; j < arr.length - i; j++) {

  51.                                 arr[j][arr.length - i - 1] = arr[j - 1][arr.length - i - 1] + 1;
  52.                         }
  53.                        
  54.                         //该循环用于确定每次回环上下边缘的数据
  55.                         for (int j = arr.length - i - 2; j >= 0 + i; j--) {
  56.                                 arr[arr.length - i - 1][j] = arr[arr.length - i - 1][j + 1] + 1;

  57.                         }
  58.                        
  59.                         //该循环用于确定每次回环上左边缘的数据
  60.                         for (int j = arr.length - i - 2; j > 0 + i; j--) {
  61.                                 arr[j][i] = arr[j + 1][i] + 1;
  62.                         }

  63.                 }
  64.                
  65.                 //使用for循环获得一维数组
  66.                 for (int i = 0; i < arr.length; i++) {
  67.                         int[] js = arr[i];
  68.                        
  69.                         //使用for循环获取每个一维数组中的元素,并按要求打印
  70.                         for (int j = 0; j < js.length; j++) {
  71.                                 System.out.print(js[j] + "\t");

  72.                         }
  73.                         //每次打印完成一个一维数据后进行换行
  74.                         System.out.println();

  75.                 }
  76.         }
  77. }
复制代码


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马