黑马程序员技术交流社区

标题: 求助打印螺旋数组有没有更好的办法? [打印本页]

作者: ysheluo    时间: 2015-4-14 10:38
标题: 求助打印螺旋数组有没有更好的办法?
  1. /*题目9:
  2. * 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:                                
  3. *                1        2        3        4
  4. *                12        13        14        5
  5. *                11        16        15        6
  6. *                10        9        8        7
  7. *思路:输入的方式是一圈接一圈,那么步骤重复可以考虑递归的方式来解决。先输入一圈,然后再递归第二圈直到完成。
  8. *同时观察发现对称的两行对应之和相等如1+10=2+9,同样12+5=11+6,这样排出一半即可知道另一半
  9. *发现n取奇取偶还不一样,奇数时最中心位置无法转到,应单独给出为n*n
  10. */
  11. public class Test9 {
  12.         //为了能在递归中用到数组则把数组变为类中成员而不是放在方法中;
  13.         static int n=4;
  14.         static int[][] arr=new int[n][n];
  15.         public static void main(String[] args) {
  16.                 method(n,1,1);
  17.                 if(n%2==1){//给出当奇数时最中心位置
  18.                         arr[n/2][n/2]=n*n;
  19.                 }
  20.                 //打印结果
  21.                 for(int i=0;i<n;i++){
  22.                         for(int j=0;j<n;j++){
  23.                                 System.out.println(arr[i][j]);
  24.                         }
  25.                 }
  26.         }
  27.         public static void method(int n,int start,int round){
  28.                 if(round>n/2){//定义递归结束边界
  29.                        
  30.                 }
  31.                 else{
  32.                                 for(int i=round-1;i<n-round+1;i++){
  33.                                         arr[round-1][i]=start+i-round+1;
  34.                                         arr[n-round][i]=3*(n-2*round+1)+start-i+round-1;//用和减去对称的值
  35.                                         if(i==n-round){
  36.                                                 for(int j=round;j<n-round;j++){
  37.                                                         arr[j][i]=start+n-3*round+2+j;
  38.                                                         arr[j][n-i-1]=start-7*round+4*n+3-j;//用和减去对称的值
  39.                                                 }
  40.                                         }
  41.                                 }
  42.                                 start=4*(n-2*round+1)+start;
  43.                                 round++;
  44.                                 method(n,start,round);//递归
  45.                 }
  46.         }
  47. }
复制代码





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