黑马程序员技术交流社区

标题: 输出 n=5 的螺旋方阵 求大神解决??? [打印本页]

作者: a546036242    时间: 2015-7-19 22:02
标题: 输出 n=5 的螺旋方阵 求大神解决???
输出 n=5 的螺旋方阵
        1  2  3  4  5
        16 17 18 19 6
        15 24 25 20 7
        14 23 22 21 8
        13 12 11 10 9
       
作者: vinoMVP    时间: 2015-7-19 22:12
                int SIZE = 5;
                int arr[][] = new int[SIZE][SIZE];
                int i, j, k = 0, n, m;
                n = SIZE;
                m = (n + 1) / 2;
                for (i = 0; i < n; i++) {
                        // 顶边,从左到右,行不变列变
                        for (j = i; j <= n - i - 1; j++)
                                arr[i][j] = ++k;// 输出1、2、3、4、13、14
                       
                        // 右边,从上到下,行变列不变
                        for (j = i + 1; j <= n - i - 1; j++)
                                arr[j][n - i - 1] = ++k; // 输出5、6、7、15
                       
                        // 底边,从右到左,行不变列变
                        for (j = n - i - 2; j >= i; j--)
                                arr[n - i - 1][j] = ++k; // 输出8、9、10、16
                       
                        // 左边,从下到上,行变列不变
                        for (j = n - i - 2; j >= i + 1; j--)
                                arr[j][i] = ++k; // 输出11、12
                }
                for (i = 0; i < n; i++) {
                        for (j = 0; j < n; j++)
                                System.out.print(arr[i][j] + "\t");
                        System.out.println("");
                }


作者: cp0717    时间: 2015-7-19 23:00
每打印到方阵边角时,行列角标互换在开始。
→ → → → →
↑  →  → →   ↓
↑  ↑    ☆    ↓  ↓
↑   ←  ←   ↓  ↓
← ←  ← ←  ↓
详细参考链接,内有设计思路。
http://wenku.baidu.com/link?url=WBKmmiqr06YsG8wcQRXTEhaUeR_RCgQ9gkquYghhVTsu4I1bW1j42CJgwyehruxbbmIiJoIqMTQLAYdBlpMWcJ7rY9fWjOWyGzzf2cLNbea
作者: cp0717    时间: 2015-7-19 23:02
对了,还有个用递归来实现的(本人小白还没看太明白)。
http://blog.chinaunix.net/uid-8615291-id-2456804.html
作者: tao13yang    时间: 2015-7-19 23:38
有没有思路,
作者: Miss.H    时间: 2015-7-19 23:52
这个还真不知道啊,不用搞这么难得,入学测试哪有那么难呢
作者: 360638403    时间: 2015-7-19 23:56
去学测试没有那么难的
作者: 小丑    时间: 2015-7-20 09:51
Miss.H 发表于 2015-7-19 23:52
这个还真不知道啊,不用搞这么难得,入学测试哪有那么难呢

我入学测试还真的就有这个题目
作者: 帅帅loyal    时间: 2015-7-20 10:42
小丑 发表于 2015-7-20 09:51
我入学测试还真的就有这个题目

那你是怎么写的呢?分享一下呗
作者: 小丑    时间: 2015-7-20 10:52
帅帅loyal 发表于 2015-7-20 10:42
那你是怎么写的呢?分享一下呗
  1. public class Test9 {
  2.         public static void main(String[] args) {
  3.                 // 根据n创建一个二维数组
  4.                 int n = 4;
  5.                 int[][] arr = new int[n][n];
  6.                 // 调用数组赋值的方法
  7.                 method(arr);
  8.                
  9.                 // 将数组遍历出来
  10.                 for (int i = 0; i < arr.length; i++) {
  11.                         for (int j = 0; j < arr.length; j++) {
  12.                                 System.out.print(arr[i][j] + "\t");
  13.                         }
  14.                         System.out.println("\n");
  15.                 }

  16.         }

  17.         // 二维数组赋值方法
  18.         public static void method(int[][] arr) {
  19.                 // 创建数组的两个索引变量
  20.                 int i = 0;
  21.                 int j = 0;
  22.                 // 通过 max 和min控制索引i,j的变化
  23.                 int max = arr.length - 1;
  24.                 int min = 0;
  25.                 // 所需要赋的值
  26.                 int num = 1;

  27.                 while (min <= max) {
  28.                         // 1、i不变j++ 向右
  29.                         while (j < max) {
  30.                                 arr[i][j++] = num++;
  31.                         }
  32.                         // 2、j不变i++ 向下
  33.                         while (i < max) {
  34.                                 arr[i++][j] = num++;
  35.                         }
  36.                         // 3、i不变j-- 向左
  37.                         while (j > min) {
  38.                                 arr[i][j--] = num++;
  39.                         }
  40.                         // 4、j不变i-- 向上
  41.                         while (i > min) {
  42.                                 arr[i--][j] = num++;
  43.                         }
  44.                         // 由于可能在n为奇数的时候无法为中心那个数赋值所以要补上这个数的赋值
  45.                         if (min == max) {
  46.                                 arr[i][j] = num;
  47.                         }
  48.                         max--;
  49.                         min++;
  50.                         // 循环一圈又开始想有赋值j++
  51.                         j++;
  52.                         // 由于向上的时候最后一次赋值i多减了一次所以每次外循环都要将i补回来
  53.                         i++;
  54.                 }
  55.         }
  56. }
复制代码

作者: 帅帅loyal    时间: 2015-7-20 10:56
小丑 发表于 2015-7-20 10:52

谢谢大神




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2