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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© WakeUp 中级黑马   /  2014-11-2 21:39  /  1773 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 WakeUp 于 2014-11-3 19:32 编辑

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

评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

10 个回复

倒序浏览
我是用迭代的思想,要进行迭代的部分是写正方形,就像写一个“回”字,先填充外层方框,再循环进入内层方框。要注意研确定好正方形的长度,比如你上面的长度依次是4,2,0,0的时候就要return了
回复 使用道具 举报
同问这个东西。
回复 使用道具 举报
数据可以先操作,不打印,根据下标来往数据里添加数据,这是我的思路
回复 使用道具 举报
小鸡捉你 发表于 2014-11-3 09:23
数据可以先操作,不打印,根据下标来往数据里添加数据,这是我的思路

那如果n不是固定的数字,下标不能确定要怎么办呢?
回复 使用道具 举报
Kikyou2014 发表于 2014-11-3 05:30
我是用迭代的思想,要进行迭代的部分是写正方形,就像写一个“回”字,先填充外层方框,再循环进入内层方框 ...

4,2,0,0是什么的长度?
回复 使用道具 举报
思路:螺旋方阵可以看成很多数字围成的圈。如果方阵为n行,就相当于一个n*n的二维数组按一定规则排列;
如果n为偶数,则有n/2个圈;若n为奇数,则有n/2+1个圈;每个圈相当于一个外层循环。
每个圈内的数字排列规则又是从上、右、下、左依次递增,直接用循环迭代出结果就行。
具体过程:初始化一个数字num为0,每迭代依次num自身加1并赋值给数组的对应项。

螺旋矩阵.jpg (16.95 KB, 下载次数: 27)

螺旋矩阵.jpg

螺旋方阵.jpg (65.92 KB, 下载次数: 24)

螺旋方阵.jpg
回复 使用道具 举报
WakeUp 发表于 2014-11-3 12:52
4,2,0,0是什么的长度?

4是外圈的长度,2是内圈的长度,0是一个没有的圈,表示返回条件,因为迭代需要一个返回条件是正方形的长度小于等于0。我写的代码没有分输入n的奇偶性。你用迭代写要注意迭代条件的限定,否则会出现栈内存溢出。
回复 使用道具 举报
Kikyou2014 发表于 2014-11-3 14:42
4是外圈的长度,2是内圈的长度,0是一个没有的圈,表示返回条件,因为迭代需要一个返回条件是正方形的长 ...

长度是以2为公差,递减的。如果是n=5的方阵就是5,3,1,-1,到-1时会return
回复 使用道具 举报
本帖最后由 李天富 于 2014-11-3 14:59 编辑
  1. class  Screw
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[][]in=new int[6][6];
  6.                 method(in,0,0);
  7.                 for (int i=0;i<in[0].length ;i++ )
  8.                 {
  9.                         for (int j=0;j<in[0].length ;j++ )
  10.                         {
  11.                                 System.out.print(in[i][j]+"\t");
  12.                         }
  13.                         System.out.println();
  14.                         System.out.println();
  15.                        
  16.                 }

  17.                
  18.         }
  19.         /*
  20.         num表示起始角标,start表示开始赋值的起始值。method函数
  21.         可以理解为从角标num开始,从左到右,然后从上到下,
  22.         然后从右到左,然后从下到上赋值一圈。迭代后即完成了全部赋值。
  23.        
  24.         */
  25.         public static void method(int[][] in,int num,int start)
  26.         {
  27.                 int x1,x2;
  28.                 x1=num;
  29.                 x2=in[0].length-1-num;
  30.                 //x1,x2代表循环左起点和右终点。
  31.                 if(x1>=in[0].length)
  32.                         return;
  33.                 if(x1==x2)
  34.                 {
  35.                         in[x1][x2]=start;
  36.                         return;
  37.                 }
  38.                 //x1==x2时,表示只剩一个元素,所以赋值后返回即可,避免重复赋值。
  39.        
  40.                 for (int i=x1;i<x2+1 ;i++ )
  41.                 {
  42.                         in[x1][i]=start++;
  43.                 }
  44.                 for(int i=x1+1;i<x2;i++)
  45.                 {
  46.                                 in[i][x2]=start++;
  47.                 }
  48.                 for(int i=x2;i>x1-1;i--)
  49.                 {
  50.                         in[x2][i]=start++;
  51.                 }
  52.                 for(int i=x2-1;i>x1;i--)
  53.                 {
  54.                         in[i][x1]=start++;
  55.                 }
  56.                 method(in,num+1,start);
  57.                

  58.         }
  59. }
复制代码

回复 使用道具 举报
lighter 发表于 2014-11-3 14:13
思路:螺旋方阵可以看成很多数字围成的圈。如果方阵为n行,就相当于一个n*n的二维数组按一定规则排列;
如 ...

嗯,明白了,外层循环是层数。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马