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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 209920266 于 2015-1-22 08:34 编辑

package com.itheima;

import java.util.Scanner;

public class Test11 {

        public static void main(String[] args) {
                System.out.println("请输入一个大于0的整数");
                Scanner sc = new Scanner(System.in);
                int num = sc.nextInt();
                print(num);
        }

        private static void print(int num) {
                int[][] arr = new int[num][num];// 定义等长的二维数组。
                int x = 0;// x控制横坐标
                int y = 0;// y控制纵坐标
                int n = arr.length;
                int value = 0;
                getArr(arr, x, y, n, value);
                printArr(arr);// 执行打印
        }

        private static void printArr(int[][] arr) {
                // 双重循环打印
                for (int[] ar : arr) {// 外循环,遍历二维数组中的一维数组
                        for (int a : ar) {// 内循环,遍历一位数组中的每一个元素
                                System.out.print(a + "\t");

                        }
                        System.out.println();
                }
        }

        private static void getArr(int[][] arr, int x, int y, int n, int value) {
                if (n > 0) {
                        // (n-1)*4代表每一圈的数值范围
                        for (int i = 0; i < (n - 1) * 4; i++) {
                                if (i < n - 1) {// 上
                                        arr[x][y] = ++value;
                                        y++;
                                } else if (i < 2 * n - 2) {// 右
                                        arr[x][y] = ++value;
                                        x++;
                                } else if (i < 3 * n - 3) {// 下
                                        arr[x][y] = ++value;
                                        y--;
                                } else if (i < 4 * n - 4) {// 左
                                        arr[x][y] = ++value;
                                        x--;
                                }
                        }
                        // 通过上面的循环,x,y的值为此圈循环的起始坐标,下一圈的起始位置为x+1,y+1
                        n -= 2;// 边界每次减少2
                        x += 1;// 下一圈起始横坐标值
                        y += 1;// 下一圈起始纵坐标值
                        if (n == 1)// 特殊情况,最里圈只有一个值
                                arr[x][y] = value + 1;
                        getArr(arr, x, y, n, value);// 递归
                }

        }
}

3 个回复

倒序浏览
路过,写的挺好
回复 使用道具 举报
学习学习
回复 使用道具 举报
学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马