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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小面团 初级黑马   /  2016-8-3 20:28  /  597 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

3 个回复

倒序浏览
n分奇数和偶数情况。
偶数时,可以把最外层看做是一个正方形,计算数据个数的方法是2*(n+(n-2))
由外向内看,可以看做一个个的正方形,且都为顺时针递增。每减一层,数据个数则为n=n-2。
知道各种情况的数量,即可对数组进行赋值,并进行打印
回复 使用道具 举报
重新想了想,不用区分奇数和偶数。代码如下:
import java.util.Scanner;
public class Prog14{
                static int n = 7;
                static int num = 1;//从1开始计数
                static int b[][]=new int[n][n];
        public static void main(String[] args){
            for(int i = n;i>0;i=i-2){
               setArray(getSize(i),n,b);
            }
            printB();  
    }
        public static int getSize(int n){//计算每层长度
                int sum = 2*(n+(n-2));
                return sum;
        }
        public static int getX(int side,int n){//得到当前坐标x
                return (n-side)/2;
        }
        public static void printB(){//打印数组
            for(int x =0;x < n;x++){
                    for(int y =0;y < n;y++){
                            System.out.print(b[x][y]+"    ");
                    }
                    System.out.println("\n");
            }   
        }
        public static void setArray(int s,int n,int b[][]){//对数组赋值
                int top = (s+4)/4;//上
                int other = top -1;//右、下
                int left = top -2;//左
                int x = getX(other,n);//数组x
                int y = x;//数组y
                for(int i  = 1 ;i <= top;i++){//上
                        b[x][y] = num;
                        num++;
                        y++;
                }
                y--;
                for(int i  = 1 ;i <= other;i++){//右
                        x++;
                        b[x][y] = num;
                        num++;
                }
                for(int i  = 1 ;i <= other;i++){//下
                        y--;
                        b[x][y] = num;
                        num++;
                }
                for(int i  = 1 ;i <= left;i++){//左
                        x--;
                        b[x][y] = num;
                        num++;
                }
        }
}
回复 使用道具 举报
这是效果n=7
1    2    3    4    5    6    7   

24    25    26    27    28    29    8   

23    40    41    42    43    30    9   

22    39    48    49    44    31    10   

21    38    47    46    45    32    11   

20    37    36    35    34    33    12   

19    18    17    16    15    14    13   
n=10
1    2    3    4    5    6    7    8    9    10   

36    37    38    39    40    41    42    43    44    11   

35    64    65    66    67    68    69    70    45    12   

34    63    84    85    86    87    88    71    46    13   

33    62    83    96    97    98    89    72    47    14   

32    61    82    95    100    99    90    73    48    15   

31    60    81    94    93    92    91    74    49    16   

30    59    80    79    78    77    76    75    50    17   

29    58    57    56    55    54    53    52    51    18   

28    27    26    25    24    23    22    21    20    19   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马