黑马程序员技术交流社区

标题: 一道题 [打印本页]

作者: 小面团    时间: 2016-8-3 20:28
标题: 一道题
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
         * 如: n = 4 则打印:
                1        2        3        4
                12        13        14        5
                11        16        15        6
                10        9        8        7
                ?
作者: xueyezhishi    时间: 2016-8-3 21:45
n分奇数和偶数情况。
偶数时,可以把最外层看做是一个正方形,计算数据个数的方法是2*(n+(n-2))
由外向内看,可以看做一个个的正方形,且都为顺时针递增。每减一层,数据个数则为n=n-2。
知道各种情况的数量,即可对数组进行赋值,并进行打印
作者: xueyezhishi    时间: 2016-8-3 23:13
重新想了想,不用区分奇数和偶数。代码如下:
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++;
                }
        }
}
作者: xueyezhishi    时间: 2016-8-3 23:15
这是效果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   




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