黑马程序员技术交流社区

标题: 在网上找了个题,代码很迷糊不是太懂。高手来。。 [打印本页]

作者: 孙浩迪    时间: 2012-7-11 19:19
标题: 在网上找了个题,代码很迷糊不是太懂。高手来。。
/**
*         写一方法,打印等长的二维数组,要求从1开始的自然数由方陈的最外圈向内螺旋方式地顺序排列。
        如: n = 4 则打印:
               1             2          3          4
                12        13        14        5
                11        16        15        6
                10         9           8           7
*/
public class Test7 {


         public static void main(String[] args) {

                  int number = 4;

                  int[][] arys = printCircle(number);

                  for (int i = 0; i < number; i++) {
                   for (int j = 0; j < number; j++) {
                    System.out.print(arys[i][j] + "\t");
                   }

                   System.out.println();
                  }
                 }


                 private static int[][] printCircle(int number) {

                  int[][] ary = new int[number][number];

                  int rightLen;
                  int downLen;
                  int leftLen;
                  int upLen;
                  
                  int rightRow = 0;
                  int rightCol = 0;
                  int leftRow = number - 1;
                  int leftCol = number - 1;
                  int downRow = 1;
                  int downCol = number - 1;
                  int upRow = number - 2;
                  int upCol = 0;

                  int digit = 1;
                  
                  while(number > 0){
                  
                   rightLen = number;
                   downLen = number - 1;
                   leftLen = number - 1;
                   upLen = number - 2;
                  
                   //Step 1: print to right
                   for(int i = 0, temp = rightCol; i < rightLen; i++){
                    ary[rightRow][temp++] = digit++;
                   }
                  
                   //Step 2: print to down
                   for(int j = 0, temp = downRow; j < downLen; j++){
                    ary[temp++][downCol] = digit++;
                   }
                  
                   //move left
                   for(int m = 0, temp = leftCol - 1; m < leftLen; m++){
                    ary[leftRow][temp--] = digit++;
                   }
                  
                   //move up
                   for(int n = 0, temp = upRow; n < upLen; n++){
                    ary[temp--][upCol] = digit++;
                   }
                  
                   number = number - 2;
                  
                   //increas/decrease the row and column
                   rightRow++;
                   rightCol++;
                   downRow++;
                   downCol--;
                   leftRow--;
                   leftCol--;
                   upRow--;
                   upCol++;
                  
                  }
                  
                  return ary;
                  
                 }

}
跪求高手,详解代码,写上注释,越详细越好。。。。
彻底迷糊。。。{:soso_e149:}
作者: 黑马振鹏    时间: 2012-7-11 21:22
public class Test7 {
         public static void main(String[] args) {

         int number = 4;

         int[][] arys = printCircle(number);

         for (int i = 0; i < number; i++) {
          for (int j = 0; j < number; j++) {
           System.out.print(arys[i][j] + "\t");
          }

          System.out.println();
         }
        }


        private static int[][] printCircle(int number) {
         //定义一个二维数组
         int[][] ary = new int[number][number];
         //长度
         int rightLen;//右边
         int downLen;//下边
         int leftLen;//左边
         int upLen;//上边
         
         int rightRow = 0;
         int rightCol = 0;
         int leftRow = number - 1;//3
         int leftCol = number - 1;//3
         int downRow = 1;
         int downCol = number - 1;//3
         int upRow = number - 2;//2
         int upCol = 0;

         int digit = 1;
         
         while(number > 0){
         
          rightLen = number;
          downLen = number - 1;//3
          leftLen = number - 1;//3
          upLen = number - 2;//2
         
          //Step 1: print to right
          //从右向左开始打印:
          //首先打印第一行for(int i=0,temp =0,i<4;i++)
          //rightCol右向行号
          for(int i = 0, temp = rightCol; i < rightLen; i++){
           ary[rightRow][temp++] = digit++;
          }
         
          //Step 2: print to down
         // for(j=0;temp=1;j<3;j++)
          //downCol打印最右边的那一列,从上往下
          for(int j = 0, temp = downRow; j < downLen; j++){
           ary[temp++][downCol] = digit++;
          }
         
          //move left
          //for(int m=0,temp=2;m<3;m++)
          //最底层,倒数第二列开始向左打印
          for(int m = 0, temp = leftCol - 1; m < leftLen; m++){
           ary[leftRow][temp--] = digit++;
          }
         
          //move up
          //for(int n =0,temp = 2;n<2;n++)
         // 打印第一列,从下往上开始
          for(int n = 0, temp = upRow; n < upLen; n++){
           ary[temp--][upCol] = digit++;
          }
         //答应一圈以后行和列都减少2,正方形缩小两行两列
          number = number - 2;
         
          //increas/decrease the row and column
          //变量变化
          rightRow++;
          rightCol++;
          downRow++;
          downCol--;
          leftRow--;
          leftCol--;
          upRow--;
          upCol++;
         
         }
         
         return ary;
         
        }


}
作者: 孙浩迪    时间: 2012-7-11 21:44
啸傲江湖007 发表于 2012-7-11 21:22
public class Test7 {
         public static void main(String[] args) {

说的不清楚啊,   详细点,清楚点
作者: 黑马张扬    时间: 2012-7-12 00:20
本帖最后由 黑马张扬 于 2012-7-12 00:24 编辑
  1. 00 01 02 03 04   
  2. 10 11 12 13 14
  3. 20 21 22 23 24
  4. 30 31 32 33 34
  5. 40 41 42 43 44
  6. 以n=5为例子  上图表示数组元素的角标  根据题目我们要按照顺序给元素赋值 并不断自增  根据这个规律一圈一圈来
  7. n为奇数时 就是n/2圈 加上中间一个    n为偶数就是n/2圈
  8. 00 01 02 03 04
  9. 10             14
  10. 20             24
  11. 30             34
  12. 40 41 42 43 44

  13. 11 12 13
  14. 21     23
  15. 31 32 33

  16.      22
  17. 这样外面的大循环 条件就确定了 打n/2个矩形
  18. 这个描述以n=5为例
  19. for(i=0;i<n/2,i++){
  20. 然后每个矩形都有4条边,这样就需要4个for循环分别打印四条边
  21. for(j=i;j<n-i;j++){  上面那条边 00 01 02 03 04   可以看出 左角标是不变的  右角标是递增的  那就需要循环的变量要递增  
  22.     if(arr[i][j]==0)      第一大圈有5个元素 (j=i(0);j<n(5)-i(0);j++)   第二大圈有3个元素 (j=i(1);j<n(5)-i(1);j++)
  23.     arr[i][j]=sum++;   第一大圈i为0  小圈j不断自增  00 01 02 03 04  这条边就搞定了
  24.    }
  25.    for(j=i;j<n-i;j++){    现在是右边的那条边  04 14 24 34 44  左角标递增  右角标不变  那就需要循环的变量要递增
  26.     if(arr[j][n-i-1]==0)     
  27.     arr[j][n-i-1]=sum++;    左角标为j递增    右角标第一大圈为4  也就是n(5)-i(0)-1  第二大圈为3 也就是n(5)-i(1)-1
  28.    }
  29.    for(j=n-i-1;j>=i;j--){   现在是下面那条边  40 41 42 43 44   题目是顺时针转 所以这从44 往40走   左角标不变 右角标递减   那就需要循环的变量要递减
  30.     if(arr[n-i-1][j]==0)   第一大圈有5个元素(j=n(5)-i(0)-1;j>=i(0);j--)第二大圈有3个元素 (j=n(5)-i(1)-1;j>=i(1);j--)
  31.     arr[n-i-1][j]=sum++;   左角标第一大圈为4 也就是n(5)-i(0)-1  第二大圈为3 也就是n(5)-i(1)-1  右角标为j递减
  32.    }
  33.    for(j=n-i-1;j>=i;j--){  最后是左边的那条边 40 30 20 10 00   左角标递减  右角标不变   那就需要循环的变量要递减
  34.     if(arr[j][i]==0)
  35.     arr[j][i]=sum++;    左角标为j递减  右角标第一大圈为i(0)  第二大圈为i(1)
  36.    }

  37. }
  38.   if(n%2==1){  n为奇数 中间会多出一个
  39.    arr[n/2][n/2]=sum;  这个就是 arr[2][2]   22
  40.   }



  41. public class MainClass {
  42. public static void main(String[] args) {
  43.   printArray(4);
  44. }

  45. public static void printArray(int n){
  46.   int[][] arr = new int[n][n];
  47.   int i,j;
  48.   int sum = 1;
  49.   for(i=0;i<n/2;i++){
  50.    for(j=i;j<n-i;j++){
  51.     if(arr[i][j]==0)
  52.     arr[i][j]=sum++;
  53.    }
  54.    for(j=i;j<n-i;j++){
  55.     if(arr[j][n-i-1]==0)
  56.     arr[j][n-i-1]=sum++;
  57.    }
  58.    for(j=n-i-1;j>=i;j--){
  59.     if(arr[n-i-1][j]==0)
  60.     arr[n-i-1][j]=sum++;
  61.    }
  62.    for(j=n-i-1;j>=i;j--){
  63.     if(arr[j][i]==0)
  64.     arr[j][i]=sum++;
  65.    }
  66.   }
  67.   if(n%2==1){
  68.    arr[n/2][n/2]=sum;
  69.   }
  70.   
  71.   for(i=0;i<n;i++){
  72.    for(j=0;j<n;j++){
  73.     System.out.print(arr[i][j]+"\t");
  74.    }
  75.    System.out.println();
  76.   }
  77. }
  78. }
复制代码

作者: 曹俊    时间: 2012-7-12 00:23
黑马张扬 发表于 2012-7-12 00:20

高手啊...膜拜下{:3_53:}
作者: 蒋映辉    时间: 2012-7-12 09:05
你们都弱了 给你们看看最强的....


public class Main {
        /**
         * 回形打印数字
         * @param args
         */
        public static void main(String[] args){
                int num=11;  //这个是需要打印的数组的长和宽度,测试时请改变这个
            int flag=num;
                int number=1;
                int[][] shuZu=new int[num][num];
               
               
               
               
                for(int i=0;i<flag;i++){      //大循环,写入第i层回形
                        for(int j=i;j<flag;j++){    //写入上边 横
                                shuZu[i][j]=number;
                                  number++;
                        }
                        for(int k=i+1;k<flag;k++){  // 写入右边竖
                                shuZu[k][flag-1]=number;
                                number++;
                        }
                       
                        for(int a=flag-2;a>=i;a--){   //写入下边横
                                shuZu[flag-1][a]=number;
                                number++;
                        }
                        for(int b=flag-2;b>i;b--){   //写入左边竖
                                shuZu[b][i]=number;
                                number++;
                        }
                       
                  flag-=1;
                }
               
               
       
               
               
                for(int i=0;i<num;i++){   //打印整个数组
                        for(int j=0;j<num;j++){
                                System.out.print(shuZu[i][j]+" ");
                        }
                        System.out.println();
                       
                }
        }

}
作者: 韦念欣    时间: 2012-7-12 13:31
蒋映辉 发表于 2012-7-12 09:05
你们都弱了 给你们看看最强的....

兄弟,没有最强只有更强,俺来写一个更强的!嘿嘿!:victory:

  1. class Matrix
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int n=4;                                                                        // 数字矩阵的维数(可以修改其他值测试)
  6.                 int[][] arr = new int[n][n];                                          // 申请二维矩阵空间
  7.                 int num=1, x=0, y=-1;                                                // 初始化数据
  8.                 while (num <= n*n)                                                   // 循环填入数据
  9.                 {
  10.                         while ( y+1<n  && arr[x][y+1]==0 ) arr[x][++y] = num++;        // 从左到右
  11.                         while ( x+1<n  && arr[x+1][y]==0 ) arr[++x][y] = num++;        // 从上到下
  12.                         while ( y-1>=0 && arr[x][y-1]==0 ) arr[x][--y]    = num++;        // 从右到左
  13.                         while ( x-1>=0 && arr[x-1][y]==0 ) arr[--x][y]    = num++;        // 从下到上
  14.                 }
  15.                 // 输出矩阵
  16.                 for (x=0; x<n; x++)
  17.                 {        for (y=0; y<n; y++)
  18.                         {
  19.                                 System.out.print(arr[x][y]+"\t");
  20.                         }
  21.                         System.out.println();
  22.                 }
  23.         }
  24. }
复制代码

作者: 蒋映辉    时间: 2012-7-12 18:32
韦念欣 发表于 2012-7-12 13:31
兄弟,没有最强只有更强,俺来写一个更强的!嘿嘿!

哈哈  确实   不过思路都差不多....




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