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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dengjiaqiang 中级黑马   /  2016-5-12 01:40  /  560 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


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

        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);                                        //创建Scanner对象, 用于接收键盘录入的数组长度
                System.out.println("请输入二维数组长度n的值: ");                                //提示用户输入
                int n = sc.nextInt();
               
                int[][] arr = new int[n][n];                                                        //创建用键盘录入的长度值,创建二维数组
                int now = 1;                                                                                        //设定初始值
                int start = 0;
                int end = n - 1;
               
                while (true) {                                                                                        //开始为数组赋值
                        now = toRight(arr, start, end, now);                                //首先向右赋值,行值不变,列值递增, 达到末尾减1处停止
                        now = toDown(arr, start, end, now);                                        //向下赋值, 列值为向右赋值的结尾固定不变, 从向右赋值开始位置递增, 进行向下赋值,达到末尾减1处停止
                        now = toLeft(arr, start, end, now);                                        //向左赋值, 行值为向下赋值的结尾固定不变, 列值从向下赋值的结尾开始递减, 进行向左赋值, 达到末尾减1处停止
                        now = toUp(arr, start, end, now);                                        //向上赋值, 列值为向左赋值的结尾固定不变, 行值从向左赋值结尾开始递减, 进行向上赋值, 达到末尾减1处停止
                                                                                                                                //至此完成一圈的赋值
                        start++;                                                                                         //将内部的未赋值数组看成新的二维数组, 只是行值和列值都增加1
                        end--;
                        if (start >= end) {                                                                        //当start大于等于end时,说明已经完成所有赋值,就可以跳出循环了
                                break;
                        }
                }
                if (n % 2 == 1) {                                                                                //由于长度为奇数的数组无法完成中心的赋值, 所以这里手动完成中心值的赋值操作
                        arr[n / 2][n / 2] = n * n;
                }
                System.out.println("数组打印如下");
                show(arr);                                                                                                //打印数组
        }
       
       
        //向上赋值, 列值为向左赋值的结尾固定不变, 行值从向左赋值结尾开始递减, 进行向上赋值, 达到末尾减1处停止
        public static int toUp(int[][] arr, int start, int end, int now) {
                for (int i = end; i > start; i--) {
                        arr[i][start] = now;
                        now++;
                }
                //返回当前赋值进度
                return now;
        }
       
       
        //向左赋值, 行值为向下赋值的结尾固定不变, 列值从向下赋值的结尾开始递减, 进行向左赋值, 达到末尾减1处停止
        public static int toLeft(int[][] arr, int start, int end, int now) {
                for (int i = end; i > start; i--) {
                        arr[end][i] = now;
                        now++;
                }
                //返回当前赋值进度
                return now;
        }
       
       
        //向下赋值, 列值为向右赋值的结尾固定不变, 从向右赋值开始位置递增, 进行向下赋值,达到末尾减1处停止
        public static int toDown(int[][] arr, int start, int end, int now) {
                for (int i = start; i < end; i++) {
                        arr[i][end] = now;
                        now++;
                }
                //返回当前赋值进度
                return now;
        }
       
       
        //首先向右赋值,行值不变,列值递增, 达到末尾减1处停止
        public static int toRight(int[][] arr, int start, int end, int now) {
                for (int i = start; i < end; i++) {
                        arr[start][i] = now;
                        now++;
                }
                //返回当前赋值进度
                return now;
        }

        //打印数组
        public static void show(int[][] arr) {
                for (int[] is : arr) {
                        for (int i : is) {
                                System.out.print(i + "\t");
                        }
                        System.out.println();
                }
        }

}

评分

参与人数 1黑马币 +6 收起 理由
yuanmeng + 6 赞一个!

查看全部评分

3 个回复

倒序浏览
标准的一道点招题,,正好最近在坐这里...............................................仔细看了一下,代码还需优化哦.......加油,给你一个赞
回复 使用道具 举报
呼呼,前辈大牛,我是黑马菜鸟,看不懂啊!  好牛逼,要努力学习才行
回复 使用道具 举报
看的晕呼呼的 感觉点招的题好难啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马