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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。如: n = 4 则打印:
1
2
3
4
12
13
14
5
11
16
15
6
10
9
8
7
  1. public class Test9 {
  2.         static int cnt=0;
  3.         static int[][] i = null;
  4.         public static void main(String[] args) {
  5.                 Scanner sc = new Scanner(System.in);
  6.                 System.out.println("请输入要打印的等长二维数组长度");
  7.                 int nextInt = sc.nextInt();
  8.                 if (nextInt > 0) {
  9.                         i=new int[nextInt][nextInt];
  10.                         shuzu(i,0,nextInt);
  11.                 } else {
  12.                         System.out.println("请重新输入");
  13.                 }
  14.                 for (int k = 0; k < nextInt; k++) {
  15.                         for (int j = 0; j < nextInt; j++) {
  16.                                 System.out.print(i[k][j]+"\t");
  17.                         }
  18.                         System.out.println();
  19.                 }
  20.         }
  21.         public static void shuzu(int[][] i, int start,int end) {
  22.                 if(end-start==1)
  23.                 {
  24.                         i[start][end-1]=++cnt;
  25.                         return;
  26.                 }
  27.                 if(start==end)
  28.                         return;
  29.                 for (int j = start; j < end-1; j++) {
  30.                         i[start][j]=++cnt;
  31.                 }
  32.                 for (int j = start; j < end-1; j++) {
  33.                         i[j][end-1]=++cnt;
  34.                 }
  35.                 for (int j = end-1; j >start; j--) {
  36.                         i[end-1][j]=++cnt;
  37.                 }
  38.                 for (int j = end-1; j >start; j--) {
  39.                         i[j][start]=++cnt;
  40.                 }
  41.                 shuzu(i,start+1,end-1);
  42.         }
  43. }
复制代码
试着做了做了一下,感觉挺有意思的!希望多批评指点!

6 个回复

倒序浏览
目前基础还不够,看的迷迷糊糊的.我先回去学学基础去.
回复 使用道具 举报
有注释更好了
回复 使用道具 举报
看着晕晕
回复 使用道具 举报
看看这个呗

example.png (143.51 KB, 下载次数: 10)

example.png
回复 使用道具 举报
我来个非递归版的。也不知道为什么,自己做题的话基本写不到递归上去……
  1. package com.itheima;

  2. /**
  3. * 9.写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
  4. * 如: n = 4 则打印:
  5. * 1     2     3     4
  6. * 12    13    14    5
  7. * 11    16    15    6
  8. * 10    9     8     7
  9. * 分析:
  10. * (1)整个螺旋可以分为多个圈。可以算出这个圈数,从外到里分别为第0,1,2,……圈;
  11. * (2)每圈螺旋可以拆分为首尾相接的上端、右端、下端、左端四条线路;
  12. * (3)因此大致框架是两层循环,外层循环是螺旋圈数,内层循环由4个串联的循环组成,分别表示四条线路。
  13. * @author Administrator
  14. *
  15. */
  16. public class Test9 {

  17.         // 在主函数中定义要打印长度为多少的螺旋排列数组并调用打印方法
  18.         public static void main(String[] args) {
  19.                 int n = 9;
  20.                 showHelixArray(n);
  21.         }

  22.         // 打印螺旋排列数组的方法,形参为二维数组的长度
  23.         public static void showHelixArray(int size) {
  24.                 // 创建二维数组
  25.                 int[][] arr = new int[size][size];
  26.                 // 计算螺旋圈数
  27.                 int circlecount = (size % 2 == 0 ? size / 2 : size / 2 + 1);
  28.                
  29.                 // 获取每一圈有多少个数字,并存放在一个数组中
  30.                 int[] numbercounts = new int[circlecount];
  31.                 for (int i = 0; i < circlecount; i++) {
  32.                         int numbercount;
  33.                         if (i != circlecount - 1) {
  34.                                 numbercount = (size - 1 - 2 * i) * 4;
  35.                         } else {
  36.                                 numbercount = (size % 2 == 0 ? (size - 1 - 2 * i) * 4 : 1);
  37.                         }
  38.                         numbercounts[i] = numbercount;
  39.                 }

  40.                 // 获取每一圈数字的起始索引,并存放在一个数组中
  41.                 int[] index = new int[circlecount];
  42.                 for (int i = 0; i < circlecount; i++) {
  43.                         int startindex = 1;
  44.                         for (int j = 0; j < i; j++) {
  45.                                 startindex = startindex + numbercounts[j];
  46.                         }
  47.                         index[i] = startindex;
  48.                 }

  49.                 // 向二维数组中按螺旋顺序添加数字
  50.                 for (int i = 0; i < circlecount; i++) {
  51.                         // 获取这一圈的数字起始索引
  52.                         int startindex = index[i];
  53.                         // 定义从起始索引开始的指针,通过指针向数组中添加数字
  54.                         int pointer = startindex;
  55.                         // 获取上下左右四条添加线路的位置极限(右边界或下边界)
  56.                         int limit = (numbercounts[i] == 1 ? 1 : numbercounts[i] / 4) + i;
  57.                         // 向上端线路中添加数字
  58.                         for (int j = i; j < limit; j++) {
  59.                                 arr[i][j] = pointer++;
  60.                         }
  61.                         // 如果最后一圈只有一个数字,则只需要走上端线路,其他情况需要四条线路依次走一遍
  62.                         if (numbercounts[i] != 1) {
  63.                                 // 向右端线路中添加数字
  64.                                 for (int j = i; j < limit; j++) {
  65.                                         arr[j][limit] = pointer++;
  66.                                 }
  67.                                 // 向下端线路中添加数字(反向)
  68.                                 for (int j = limit - 1; j >= i; j--) {
  69.                                         arr[limit][j + 1] = pointer++;
  70.                                 }
  71.                                 // 向左端线路中添加数字(反向)
  72.                                 for (int j = limit - 1; j >= i; j--) {
  73.                                         arr[j + 1][i] = pointer++;
  74.                                 }
  75.                         }
  76.                 }
  77.                
  78.                 // 添加完毕后,打印二维数组
  79.                 for (int i = 0; i < size; i++) {
  80.                         for (int j = 0; j < size; j++) {
  81.                                 System.out.print(arr[i][j] + "\t");
  82.                         }
  83.                         System.out.println();
  84.                 }
  85.         }
  86. }
复制代码
回复 使用道具 举报
zzy1990 高级黑马 2015-11-12 10:23:00
7#
学习了,谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马