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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

必须赞一个,我头都转晕了我,都没看出来!
回复 使用道具 举报
fantacyleo 发表于 2015-4-7 23:13
已经告诉你了嘛:同样基于按层填充思路。当然看着像。不过我刚才试了一下,我这个代码实际上已经解决了奇 ...

我在看看哈{:3_65:}
回复 使用道具 举报

我明白你的问题在哪儿了。我们的代码区别在于,转角处的位置交给谁来填。你的做法是,把转角位置作为新方向的起点。我的做法是,转角的下一个位置作为新方向的起点。那么当遇到奇数时,最内层只有1个数,这个数实际上是扮演了4个转角的角色。当向右填充时,它是右和下方向的转角,右是不填充它的。当向下填充时,它是下和左方向的转角,下是不填充它的。以此类推就是所有方向都不填充它,最后就空着没人填了
回复 使用道具 举报
可能是迭代的时候漏了最后一个
回复 使用道具 举报
fantacyleo 发表于 2015-4-7 23:30
我明白你的问题在哪儿了。我们的代码区别在于,转角处的位置交给谁来填。你的做法是,把转角位置作为新方 ...

哦   ,谢谢大哥,终于找出问题了{:3_64:}
回复 使用道具 举报
这个比较全面,厉害~~
回复 使用道具 举报
看不懂啊,待会好好想想
回复 使用道具 举报
你是不是蚊子红?
回复 使用道具 举报

不是{:3_53:}
回复 使用道具 举报
  1. /*
  2. 输出 n=5 的螺旋方阵
  3.         1  2  3  4  5
  4.         16 17 18 19 6
  5.         15 24 25 20 7
  6.         14 23 22 21 8
  7.         13 12 11 10 9

  8. */
  9. class  Example001
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                        
  14.                 int size = 5;
  15.                 int arr[][] = new int[size][size];
  16.                 int i, j, k = 0, n, m;
  17.                 n = size;
  18.                 for (i = 0; i < n; i++) {
  19.                         // 顶边,从左到右,行不变列变
  20.                         for (j = i; j <= n - i - 1; j++)
  21.                                 arr[i][j] = ++k;// i=0进来是输出1、2、3、4、5; i=1进来输出17、18、19 ;i=3,输出25
  22.                        
  23.                         // 右边,从上到下,行变列不变
  24.                         for (j = i + 1; j <= n - i - 1; j++)
  25.                                 arr[j][n - i - 1] = ++k; // i=0进来是输出6、7、8、9 ; i=1进来输出20、21
  26.                        
  27.                         // 底边,从右到左,行不变列变
  28.                         for (j = n - i - 2; j >= i; j--)
  29.                                 arr[n - i - 1][j] = ++k; // i=0进来是输出10、11、12、13;i=1进来输出22、23
  30.                        
  31.                         // 左边,从下到上,行变列不变
  32.                         for (j = n - i - 2; j >= i + 1; j--)
  33.                                 arr[j][i] = ++k; // i=0进来是输出14、15、16 ;i=1进来输出24
  34.                 }
  35.                
  36.                 for (i = 0; i < n; i++) {
  37.                         for (j = 0; j < n; j++)
  38.                                 System.out.print(arr[i][j] + "\t");
  39.                         System.out.println();
  40.                 }
  41.                
  42.                
  43.                
  44.         }
  45. }
复制代码
回复 使用道具 举报
晕了   我还是复制下来运行一下看看
回复 使用道具 举报
这个问题其实 我都没看懂,楼主的分析 让我理解了 赞一个
回复 使用道具 举报
君嘘 来自手机 中级黑马 2015-4-9 14:42:00
33#
打印不出来是因为最后的数没有存进数组吧……
因为用i<n*n的话  n为奇数时就无法判断最后一次从左到右的for循环

解决方法很简单  如果n为奇数   手动把n*n的值传入数组的中心角标   arr [n/2][n/2]
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马