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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
public class Test9 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                System.out.println("请输入一个整数:");
                Scanner s = new Scanner(System.in);// 获取键盘存入
                int n = s.nextInt();// 读取一个int
                // System.out.println(n);
                int[][] array = new int[n][n];// 建立二维数组存入数据

                int count = 0;// 要循环次数
                if (n % 2 == 0)
                        count = n / 2;// 偶数时好
                else
                        count = n / 2 + 1;// 奇数时加1
                int data = 1;// 初始化数据
                // 循环开始填充数据
                for (int i = 0; i < count; i++) {

                        // 从左到右
                        for (int j = i; j < n - i; j++) {//选填满顶部行
                                array[i][j] = data++;

                        }
                        // 从上到下
                        for (int k = i + 1; k < n - i ; k++) {
                                array[k][n - i - 1] = data++;
                        }
                        // 从右到左
                        for (int x = n - i - 2; x > i; x--) {
                                array[n - i - 1][x] = data++;
                        }
                        // 从下到上
                        for (int y = n - i - 1; y > i; y--) {
                                array[y][i] = data++;
                        }

                }
                for (int i = 0; i < array.length; i++) {
                        for (int j = 0; j < array[i].length; j++) {
                                System.out.print(array[i][j] + "\t");
                        }
                        System.out.println();
                }

        }
}

点评

小心别让版主看到了,要删帖扣分的:shutup:  发表于 2015-3-28 16:30

评分

参与人数 2黑马币 +11 收起 理由
森森 + 8 淡定
lffwsjj + 3 神马都是浮云

查看全部评分

15 个回复

倒序浏览
学习了                        
回复 使用道具 举报
入学考题好难啊。。。你用了多久做出来的?
回复 使用道具 举报
我的思路是每填充一个数字就根据一定的规则判断下一步该往哪个方向走。这里的规则是先确定当前可以走的方向,然后按题目要求确定最终走向。“当前可以走的方向”通过是否触碰边界来判断。边界有2个,一是数组本身的边界,二是已经填充过的位置。核心代码如下:
  1. public static void fill(int[][] square) {
  2.             int dim = square.length;
  3.             int num = 1, i = 0, j = 0;
  4.             for (;num <= dim * dim; num++) {
  5.                     square[i][j] = num;
  6.                     boolean right = j < dim - 1 && square[i][j + 1] == 0;
  7.                     boolean down = i < dim - 1 && square[i + 1][j] == 0;
  8.                     boolean left = j > 0 && square[i][j - 1] == 0;
  9.                     boolean up = i > 0 && square[i - 1][j] == 0;
  10.                    
  11.                    
  12.                     if (right && down)
  13.                             j++;
  14.                     else if (down)
  15.                             i++;
  16.                     else if (left)
  17.                             j--;
  18.                     else if (up)
  19.                             i--;
  20.                     else if (right)
  21.                             j++;
  22.                    
  23.             }
  24.         }
复制代码
回复 使用道具 举报
a1301155262 来自手机 中级黑马 2015-3-28 23:16:40
报纸
题目都有点看不懂。。收藏下
回复 使用道具 举报
螺旋方阵?  大神呀
回复 使用道具 举报
这种算法的题 很讨人厌!!!
回复 使用道具 举报
godot 中级黑马 2015-3-30 11:25:42
8#
顶一个。。。。
回复 使用道具 举报
收藏一下!
回复 使用道具 举报
用递归算法
回复 使用道具 举报
ddddk 中级黑马 2015-3-30 14:06:03
11#
这个要学习一下
回复 使用道具 举报
最讨厌这种算法题了
回复 使用道具 举报
学习了
回复 使用道具 举报
我的做法,不知道效率怎么样
  1. 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:   
  2. *                 1   2   3   4
  3. *                 12  13  14        5
  4. *                 11        16  15        6
  5. *                 10  9   8   7
  6. *                 分析:
  7. *                         1.等长的二维数组,new int[length][length],最大索引为length-1.此处的length为题目中的n。
  8. *                         2.图形中的数字是递增的,范围是 1 ~ length*length
  9. *                         3.定义变量x记录二维数组的索引,y记录一维数组的索引。x控制索引的纵向移动,y控制索引的横向移动。
  10. *                         4.图形是由多个闭合的数字组成的长方形组合起来的。用循环语句实现,定义计数器int count记录循环的次数,每次循环结束后+1.
  11. *                         5.第一次的起点位置是arr[0][0],以后每次循环的起点为arr[count][count]
  12. *                         6.向右移动, x不变, y++, 自增后赋值, 循环条件为x==count&&y<length-1-count
  13. *                               向下移动, y不变,  x++, 自增后赋值, 循环条件为y==length-1-count&&x<length-1-count
  14. *                               向左移动, x不变,  y--, 自减后赋值, 循环条件为x==length-1-count&&y>count
  15. *                               向上移动, y不变,  x--, 自减后赋值, 循环条件为y==count&&x>count+1:每次循环的起点位置已经赋值,所以x>count+1
  16. */
  17. package com.itheima;

  18. import java.util.Scanner;

  19. /**
  20. * 9、 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
  21. *          1   2   3   4
  22. *                 12  13  14        5
  23. *                 11        16  15        6
  24. *                 10  9   8   7
  25. *
  26. * @author 面具
  27. *
  28. */
  29. public class Test9 {
  30.         public static void main(String[] args) {
  31.                 System.out.println("请输入二维数组的长度,");
  32.                 // 获取键盘录入的数字
  33.                 @SuppressWarnings("resource")
  34.                 Scanner sc = new Scanner(System.in);
  35.                 int length = sc.nextInt();
  36.                 // 定义二维数组,接收赋值后的等长二维数组
  37.                 int[][] arr = method(length);
  38.                 // 调用方法遍历二维数组
  39.                 printArr(arr);
  40.         }

  41.         /**
  42.          * @param arr
  43.          *            接收一个需要遍历的二维数组
  44.          */
  45.         public static void printArr(int[][] arr) {
  46.                 // 外层循环遍历二维数组中的一维数组
  47.                 for (int x = 0; x < arr.length; x++) {
  48.                         // 内循环遍历一维数组中的元素
  49.                         for (int y = 0; y < arr[x].length; y++) {
  50.                                 // 打印元素
  51.                                 System.out.print(arr[x][y] + "\t");
  52.                         }
  53.                         System.out.println();
  54.                 }

  55.         }

  56.         /**
  57.          * @param length
  58.          *            接收一个int型变量,该变量为二维数组的长度
  59.          * @return 返回赋值后的二维数组
  60.          */
  61.         public static int[][] method(int length) {
  62.                 // 定义一个等长二维数组
  63.                 int[][] arr_1 = new int[length][length];
  64.                 // 定义变量记录二维数组的中一位数组的值
  65.                 int num = 1;
  66.                 // 定义变量记录循环的次数
  67.                 int count = 0;
  68.                 // 循环语句,控制条件为num<=length*length
  69.                 while (num <= (length * length)) {
  70.                         // 定义变量记录二维数组的索引值
  71.                         int i = count;
  72.                         // 定义变量记录一维数组的索引值
  73.                         int j = count;
  74.                         // 给每次循环的起点赋值
  75.                         arr_1[i][j] = num++;
  76.                         // 向右移动,i不变, j++
  77.                         while (i == count && j < length - 1 - count) {
  78.                                 // 一维数组索引自增
  79.                                 j++;
  80.                                 arr_1[i][j] = num++;
  81.                         }
  82.                         // 向下移动,j不变,i++
  83.                         while (j == length - 1 - count && i < length - 1 - count) {
  84.                                 // 二维数组索引自增
  85.                                 i++;
  86.                                 arr_1[i][j] = num++;
  87.                         }
  88.                         // 向左移动,i不变,j--
  89.                         while (i == length - 1 - count && j > count) {
  90.                                 // 一维数组索引自减
  91.                                 j--;
  92.                                 arr_1[i][j] = num++;

  93.                         }
  94.                         // 向上移动,j不变,i--
  95.                         while (j == count && i > count + 1) {
  96.                                 // 二维数组索引自减
  97.                                 i--;
  98.                                 arr_1[i][j] = num++;
  99.                         }
  100.                         count++;
  101.                 }

  102.                 return arr_1;
  103.         }
  104. }
复制代码



回复 使用道具 举报
算法什么的最讨厌了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马