黑马程序员技术交流社区

标题: 如何将此代码优化成任意长宽的排列 [打印本页]

作者: 清风有意    时间: 2014-4-10 15:09
标题: 如何将此代码优化成任意长宽的排列
本人写的正方形代码如下:

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

  10.         public static void main(String[] args) {
  11.                 int[][] arr=new int[9][9];
  12.                 circleArr(arr);
  13.                 for(int x=0;x<arr.length;x++)
  14.                 {
  15.                         for(int y=0;y<arr[0].length;y++)
  16.                         {
  17.                                 System.out.print(arr[x][y]+"  \t  ");
  18.                                
  19.                         }
  20.                         System.out.println();
  21.                 }
  22.        
  23.         }

  24.         private static void circleArr(int[][] arr) {
  25.                 int x=0,y=0;
  26.                 int max=arr.length-1;
  27.                 int min=0;
  28.                 int z=0;
  29.                 for(;max>=min;){
  30.                
  31.                         for(;y<max;y++){       
  32.                                 z++;
  33.                         arr[x][y]=z;
  34.                         }
  35.                        
  36.                         for(;x<max;x++)
  37.                         {        z++;
  38.                                 arr[x][y]=z;
  39.                         }
  40.                        
  41.                         for(;y>min;y--)
  42.                         {        z++;
  43.                                 arr[x][y]=z;
  44.                         }
  45.                         for(;x>min;x--)
  46.                         {
  47.                                 z++;
  48.                                 arr[x][y]=z;
  49.                         }
  50.                         if(max==min)
  51.                         {
  52.                                 arr[x][y]=++z;
  53.                         }
  54.                         x++;
  55.                         y++;
  56.                         max--;
  57.                         min++;
  58.                 }
  59.         }

  60. }
复制代码

作者: ehuashao    时间: 2014-4-11 09:55
用类似树的深度搜索,走完一步,去搜索可走的下一步。注释很详细,不详解了。
  1. public class Test99 {

  2.         public static void main(String[] args) {
  3.                 Test99 test = new Test99();
  4.                 //从键盘接收一个数,动态确定数组大小
  5.                 System.out.println("请输入一个数,来作为您的二位数组长度:");
  6.                 Scanner sc = new Scanner(System.in);
  7.                 int chang = sc.nextInt();
  8.                 System.out.println("请输入一个数,来作为您的二位数组宽度:");
  9.                 int kuan = sc.nextInt();
  10.                 int[][] arr = new int[chang][kuan];
  11.                 //数组初始值都设置为0,代表每一位还没有被访问过。
  12.                 for(int i=0;i<chang;i++){
  13.                         for(int j=0;j<kuan;j++)
  14.                                 arr[i][j] = 0;
  15.                 }
  16.                
  17.                 /*观察得数字运动路线为:右,下,左,上。所有定义变量来记录上一个数字运动方向。
  18.                   右:1  下:2  左:3 上:4 .第一步肯定往右,所有move初始值为1.
  19.                  */
  20.                 int move =1;
  21.                 int step =0;//记录步数
  22.                 int i=0,j=0;//初始位置
  23.        
  24.                 while(step < chang*kuan){
  25.                         move = test.printArr(arr, i, j, move, chang,kuan);
  26.                         switch(move){
  27.                                 case 1:
  28.                                         arr[i][j++] = ++step;                               
  29.                                         break;
  30.                                 case 2:
  31.                                         arr[i++][j] = ++step;                               
  32.                                         break;
  33.                                 case 3:
  34.                                         arr[i][j--] = ++step;                               
  35.                                         break;
  36.                                 case 4:
  37.                                         arr[i--][j] = ++step;                               
  38.                                         break;
  39.                                 case -1:
  40.                                         break;
  41.                         }
  42.                 }
  43.        
  44.                 //输出数组
  45.                 for(int m=0;m<chang;m++){
  46.                         for(int n=0;n<kuan;n++){
  47.                                 System.out.print(arr[m][n]+"   ");
  48.                         }               
  49.                         System.out.println("");
  50.                 }
  51.         }
  52.        
  53.         //根据上一步的运动,以及边界条件来判断下一步该往哪个方向运动
  54.         public int printArr(int[][]arr,int i,int j,int move,int chang,int kuan){
  55.                 //如果上一步是向右走,则判断该位置右侧是否已被访问或已达边界,是返回2,指示下一步向下走,否则返回1继续向右走
  56.                 if(move == 1){
  57.                         if((j+1)>=kuan || arr[i][j+1] !=0){
  58.                                 return 2;
  59.                         }
  60.                         else return 1;
  61.                 }
  62.                 //如果上一步向下走,则判断该位置下面位置是否已被访问或已达边界,是返回3,指示下一步向左走,否返回2继续下走。
  63.                 else if(move == 2){
  64.                         if((i+1)>=chang || arr[i+1][j] != 0){
  65.                                 return 3;
  66.                         }
  67.                         else return 2;
  68.                 }
  69.                 //如果上一步向左走,则判断该位置左侧位置是否已被访问或已达边界,是返回4,指示下一步向上走,否返回3继续左走。
  70.                 else if(move == 3){
  71.                         if(j<=0 || arr[i][j-1] != 0){
  72.                                 return 4;
  73.                         }
  74.                         else return 3;
  75.                 }
  76.                 //如果上一步向上走,则判断该位置上面位置是否已被访问或已达边界,是返回1,指示下一步向右走,否返回4继续向上走。
  77.                 else if(move == 4){
  78.                         if(i<=0 || arr[i-1][j] != 0){
  79.                                 return 1;
  80.                         }
  81.                         else return 4;
  82.                 }
  83.                 return -1;
  84.                
  85.         }
  86. }
复制代码





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