黑马程序员技术交流社区

标题: 真题 !不信难不到你! [打印本页]

作者: blueblueblue    时间: 2016-9-20 09:21
标题: 真题 !不信难不到你!
[Java] 纯文本查看 复制代码
package com.itheima;
/**
* 8、写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
* 1        2        3        4
* 12        13        14        5
* 11        16        15        6
* 10        9        8        7
* @author admin
*
*/
public class Test08 {
        public static void main(String[] args) {
               
                //确定二维数组的长度
                int size = 6;
               
                //调用initialize方法对各个变量初始化
                initialize(size);
    }

        //initialize方法
        private static void initialize(int size) {
               
                //根据传入的长度创建二维数组
                int[][] arr = new int[size][size];
               
                //创建计数器
                int count = 1;
               
                //定义圈数(方阵最外圈是第一圈)
                int circle = 1;
               
                //调用start方法,开始给数组的各个元素赋值
                start(arr,count,circle);
               
                //打印数组
                print(arr);
        }
       
        //start方法
        private static void start(int[][] arr,int count,int circle) {
               
                //将数组长度赋值给size
                int size = arr.length;
               
                //判断如果计数器的值超过二维数组元素的个数,就结束方法
                if (count > size * size) {
                        return;
                }
               
                //为第circle圈的上边填值
                for(int i = circle - 1; i <= size - circle; i++) {
                        arr[circle - 1] = count++;
                }
               
                //为第circle圈的右边填值
                for(int i = circle ; i <= size - circle; i++) {
                        arr[size - circle] = count++;
                }
               
                //为第circle圈的下边填值
                for(int i = size - circle - 1; i >= circle - 1; i--) {
                        arr[size - circle] = count++;
                }
               
                //为第circle圈的左边填值
                for(int i = size - circle - 1; i >= circle; i--) {
                        arr[circle - 1] = count++;
                }
               
                //外圈填完,将circle加1,递归调用
                start(arr,count,circle + 1);
        }
       
        //打印输出
        private static void print(int[][] arr) {
               
                //外层循环控制行数
                for(int i = 0; i < arr.length; i++) {
                       
                        //内层循环控制列数
                        for(int j = 0; j < arr.length; j++) {
                               
                                //输出每个元素,并用空格隔开
                                System.out.print(arr[j] + " ");
                        }
                       
                        //换行
                        System.out.println();
                }
        }
}


作者: 毕加索    时间: 2016-9-20 21:11
好题,好难!
作者: 冷冷冷白    时间: 2016-9-20 21:48
学习学习
作者: mqxin    时间: 2016-9-21 00:23
今天恰好也写了一下这个题,发上来参考一下

[Java] 纯文本查看 复制代码
package com.heima.other;

public class Test01 {

        /**
         * 9、 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
         */
        public static void main(String[] args) {
                int n = 5;       //二维数组的长度
                int[][] arr = new int[n][n];
                int num = 1;
                for (int i = arr.length; i > arr.length / 2 ; i--) {
                        int j = arr.length - i;
                        for (int k = j; k < i; k++) {
                                arr[j][k] = num++;
                        }
                        for (int k = j + 1; k < i; k++) {
                                arr[k][i - 1] = num++;
                        }
                        for (int k = i - 2; k >= j; k--) {
                                arr[i - 1][k] = num++;
                        }
                        for (int k = i - 2; k > j; k--) {
                                arr[k][j] = num++;
                        }
                }
                int count = 0;
                for (int[] is : arr) {
                        for (int i : is) {
                                System.out.print(i + "\t");
                                count++;
                                if (count % n == 0) {
                                        System.out.println();
                                }
                        }
                }
        }

}

作者: 我就是那匹黑黑    时间: 2016-9-21 00:36

学习学习下
作者: 荔荔舟    时间: 2016-9-21 03:06
感谢,前两天看了这个题,真是一点思路没有
作者: Array先生    时间: 2016-9-21 05:12
这个题有价值




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