黑马程序员技术交流社区

标题: 关于螺旋打印的问题 [打印本页]

作者: dengjiaqiang    时间: 2016-5-12 01:40
标题: 关于螺旋打印的问题

* 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();
                }
        }

}
作者: yuanmeng    时间: 2016-5-15 19:50
标准的一道点招题,,正好最近在坐这里...............................................仔细看了一下,代码还需优化哦.......加油,给你一个赞
作者: 黎贵福    时间: 2016-5-15 20:25
呼呼,前辈大牛,我是黑马菜鸟,看不懂啊!  好牛逼,要努力学习才行
作者: 729524251    时间: 2016-5-15 21:39
看的晕呼呼的 感觉点招的题好难啊




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