黑马程序员技术交流社区

标题: 一道黑马测试题,脑袋都破了 [打印本页]

作者: 无气打火机    时间: 2013-7-28 21:50
标题: 一道黑马测试题,脑袋都破了
本帖最后由 杨兴庭 于 2013-7-29 17:48 编辑
  1. public class Test9 {  
  2.         public static void main(String[] args) {  
  3.                 arraynum(4);  
  4.         }  

  5.         //便于改代码..输入不同y值输出不同的二维数列  
  6.         private static void arraynum(int y) {  
  7.                 int[][] arr=new int[y][y]; //创建一个二维数组,长度为y
  8.                 int size=arr.length;//获得数组长度
  9.                 int max=0;  //初始化最大值
  10.                 int count=0;  //计数器
  11.                 specArr(arr,size,max,count);  
  12.                 arrprint(arr);  
  13.         }  

  14.         //增强for输出打印用的  
  15.         private static void arrprint(int[][] arr) {  
  16.                 for(int[] in:arr)  {  
  17.                         for(int t:in)  {         
  18.                                 if(t<10)
  19.                                         System.out.print(" "+t+" ");  
  20.                                 else
  21.                                         System.out.print(t+" ");  
  22.                         }  
  23.                         System.out.println();  
  24.                 }  

  25.         }  

  26.         //利用递归,一层一层写进去..  
  27.         private static void specArr(int[][] arr,int size,int max,int count) {  

  28.                 if(size>0) {  //如果长度大于0
  29.                         int j=0;  
  30.                         for(int i=0;i<(size-1)*4;i++) {//??  
  31.                                 if (i<size-1) //??  
  32.                                         arr[0+count][i+count]=++max;  //??  
  33.                                 else if (i<2*size-2) //??  
  34.                                         arr[count+j++][arr.length-1-count]=++max;  //??  
  35.                                 else if (i<3*size-3)//??  
  36.                                         arr[arr.length-1-count][(j--)+count]=++max;  //??  
  37.                                 else if (i<4*size-4) //??  
  38.                                         arr[arr.length-1-(j++)-count][0+count]=++max;  //??                          
  39.                         }         
  40.                         if(size==1) {
  41.                                 arr[arr.length/2][arr.length/2]=max+1 ;//注意到 当y值为奇数时,会有循环到n=1的情况,需要补进数组最中间值  
  42.                         }
  43.                         count++; //计数器叠加
  44.                         size-=2;  //每次调用长度都减2
  45.                         specArr(arr,size,max,count);  //自己调用自己,实现递归
  46.                 }  
  47.         }  

  48. }   
复制代码
网上找的代码,打问号的实在不知道什么意思,脑细胞都死光了。。。。。。。。。。求大神
作者: 王磊    时间: 2013-7-28 22:31
通过一圈的填充顺序给楼主注释上填充一圈的实际情况模拟。
  1. //将螺旋数组由外到内按圈数做循环填充
  2.         private static void specArr(int[][] arr,int size,int max,int count) {  

  3.                 if(size>0) {  //如果长度大于0
  4.                         int j=0;  
  5.                         for(int i=0;i<(size-1)*4;i++) {//获取每一圈的元素个数,并用此最为循环判断条件 ,以下注释以第一圈为例
  6.                                 if (i<size-1) //左移填充,从起始位置左移填充4位  
  7.                                         arr[0+count][i+count]=++max;  //也就是[0][0]、[0][1]、[0][2]、[0][3]  
  8.                                 else if (i<2*size-2) //下移填充  ,从当前位置下移填充3位
  9.                                         arr[count+j++][arr.length-1-count]=++max;  //也就是[1][3]、[2][3]、[3][3]  
  10.                                 else if (i<3*size-3)//右移填充,从当前位置右移填充3位  
  11.                                         arr[arr.length-1-count][(j--)+count]=++max;  //也就是[3][2]、[3][1]、[3][0]   
  12.                                 else if (i<4*size-4) //上移填充,从当前位置上移填充2位
  13.                                         arr[arr.length-1-(j++)-count][0+count]=++max;  //也就是[2][0]、[1][0]                          
  14.                         }         
  15.                         if(size==1) {//当圈数为基数时,执行
  16.                                 arr[arr.length/2][arr.length/2]=max+1 ;//注意到 当y值为奇数时,会有循环到n=1的情况,需要补进数组最中间值  
  17.                         }
  18.                         count++; //计数器叠加
  19.                         size-=2;  //每次调用长度都减2
  20.                         specArr(arr,size,max,count);  //递归,进入下一圈的填充操作
  21.                 }  
  22.         }
复制代码
个人感觉这种实现螺旋数组的算法,貌似很复杂。反正我做这个的时候,不是这么写的。。。

希望可以帮到楼主
作者: 无气打火机    时间: 2013-7-28 23:46
王磊 发表于 2013-7-28 22:31
通过一圈的填充顺序给楼主注释上填充一圈的实际情况模拟。个人感觉这种实现螺旋数组的算法,貌似很复杂。反 ...

万分感谢。。。。果然还是黑马的大牛多
作者: 王磊    时间: 2013-7-28 23:56
无气打火机 发表于 2013-7-28 23:46
万分感谢。。。。果然还是黑马的大牛多

客气,,,共同进步。。




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