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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 caolufo 于 2016-8-1 22:20 编辑

写了一下午,终于写出来了。
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
1    2  3  4
12 13 14 5
11 16 15 6
10   9   8  7  
从实例n=4写,然后替换为N,替换以后,就完全懵了,自己也看不懂了,但能运行。

import java.util.Scanner;
/**
*  1  2  3  4
*  12 13 14 5
*  11 16 15 6
*  10  9 8  7  
*  
*  1 2 3
*  8 9 4
*  7 6 5
* 分析规律:               
*     第一圈: 【0】【0】-【0】【1】-【0】【2】-【0】【3】 →
*                    【1】【3】-【2】【3】-【3】【3】   ↓
*                    【3】【2】-【3】【1】-【3】【0】  ←
*                    【2】【0】-【1】【0】     ↑
*     第二圈 :  【1】【1】-【1】【2】   →
*                      【2】【2】   ↓
*                      【2】【1】   ←
*                         每一圈同一方向相比,元素个数少2个,2个索引会++或--变化。
*  @author caoliang
*/
public class Test8 {
        public static void main(String[] args) {
                Scanner sc=new Scanner(System.in);
                System.out.println("请输入N(正整数):");
                int n=sc.nextInt();
                sc.close();
                int[][] arr=creatArrary(n);
               
                for (int i = 0; i < arr.length; i++) {
                        for (int j = 0; j < arr.length; j++) {
                                System.out.print(arr[j]+"\t");
                        }
                        System.out.println();
                }        
        }

        
        /**
         * 根据n生成二维数组的方法,按圈数赋值。
         * 外循环while控制圈数(→↓←↑为一圈),四个for循环分别为每个方向的数组元素赋值。
         * @param int
         * @return int[][]
         */
        public static int[][] creatArrary(int n) {
                int[][] arr = new int[n][n];
                int t=1;  //通过t,t++为数组元素赋值
                int a=0;  //一个与圈数相关的变量
               
          while(true){
                        //根据数组元素个数判定循环结束
                        if(t>n*n)   
                                break;
                        
                //向 右→ 赋值
            for(int j=0+a;j<n-a;j++){
                    arr[0+a][j]=t;
                    t++;
            }
            
            //向   下↓ 赋值
            for(int i=1+a;i<n-a;i++){
                    arr[n-1-a]=t;
                    t++;
            }
            
            //向   左← 赋值
            for(int j=n-2-a;j>=0+a;j--){
                    arr[n-1-a][j]=t;
                    t++;
            }
            
            //向   上↑ 赋值
            for(int i=n-2-a;i>=1+a;i--){
                    arr[0+a]=t;
                    t++;
            }
            a++;  //下一圈
           }
                return arr;
        }

}




1 个回复

倒序浏览
本帖最后由 caolufo 于 2016-8-1 22:27 编辑

n=10的效果。






1.png (10.81 KB, 下载次数: 14)

1.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马