黑马程序员技术交流社区

标题: 输出螺旋方阵 [打印本页]

作者: LPStone    时间: 2015-4-29 23:45
标题: 输出螺旋方阵
这个是今天的作业。首先了解一下什么是螺旋方阵:
      n = 5的螺旋方阵:
        1   2   3   4   5
        16 17 18 19 6
        15 24 25 20 7
        14 23 22 21 8
        13 12 11 10 9  

主要考察for循环和二位数组的使用。
思路:
        1.首先观察到这是一个5 x 5的二维矩阵,我们可以找到每个数字对应的数组下标,将其存入数组对应
的元素中,然后打印二位数据就可以输出螺旋矩阵了。那么下面就是如何获取下标,并存入数组了。
          在此定义一个  n = 5 的n阶二维数组:int [][]arr = new int[n][n];
        2.同时可以看成3个正方行的嵌套,从外到内第一个正方形由1~16围成,第二个由17~24围成,第三
个由25围成(我们可以把一个数据看做最小的正方形)。由此推出n阶螺旋方阵应该由 m = (n+1)/2 个正方
形围成(注意:'/'是取整运算)。这样就可以很容易套进for循环了。
        3.先定义一个以第一个正方形为例: i = 0//i 表示从外到内第(i + 1)个正方形。
          定义二维数组的两个下标:int x = 0,y = 0;//x 表示列下标    y表示行下标
          定义int k = 1;//k 表示要存入数组中的数据
          先把顶边1~5存入数组中:
                        for(x = i;x <= (n - 1) - i;x++)
                        {
                                arr[y][x] = k++;//注意行和列下标的对应,别搞反了!

                        }

                       x--;/for的控制条件x++ 最后给x多加了1 ,在此处需要减去
           再将右边6~9存入数组中:     
                        for(y = i + 1;y <= (n - 1) - i ;y++)
                        {
                                arr[y][x] = k++;

                        }

                        y--;//前一个for的控制条件y++ 最后给y多加了1 ,在此处需要减去
            同理将底边10~13存入数组中:         
                        for(x = (n - 1) - i - 1 ;x >= i;x--)
                        {
                                arr[y][x] = k++;

                        }
                        x++;
             最后将左边14~16存入数组中:       

                        for(y = (n- 1) - i - 1;y >= i + 1;y--)
                        {
                                arr[y][x] = k++;

                        }

                        y++;
           至此一个正方形就处理完了,其他正方形同理按此方法处理,最后即可将数据存入对应的位置上。
         4.剩下的就是打印数组啦:
                for(int i = 0;i < n;i++ )
                {
                        for(int j = 0;j < n;j++)
                        {
                                System.out.print(arr[i][j]+"\t");
                        }
                       System.out.println();
                }


最终代码:
class Test
{
        public static void main(String[] args)
        {
                int size = 6;
                int [][] arr = new int[size][size];
                getHelixMatrix(arr);
                printArray(arr);
        }

        public static void getHelixMatrix(int[][] arr)
        {
                int n = arr.length;//获取矩阵的阶数
                int m = (n + 1)/2;
                int x = 0, y = 0;
                int k = 1;
                for(int i = 0;i < m;i++)
                {
                        //把顶边存入数组中
                        for(x = i;x <= (n - 1) - i;x++)
                        {
                                arr[y][x] = k++;//注意行和列下标的对应,别搞反了!
                                System.out.println("arr["+y+"]["+x+"]="+arr[y][x]+"\t");
                        }
                        System.out.println();
                        x--;//for的控制条件x++ 最后给x多加了1 ,在此处需要减去                       
                       
                        //把右边存入数组中
                        for(y = i + 1;y <= (n - 1) - i ;y++)
                        {
                                arr[y][x] = k++;
                                System.out.println("arr["+y+"]["+x+"]="+arr[y][x]+"\t");
                        }
                        System.out.println();
            y--;//前一个for的控制条件y++ 最后给y多加了1 ,在此处需要减去
                    
                        //把底边存入数组中
                    for(x = (n - 1) - i - 1 ;x >= i;x--)
                        {
                                arr[y][x] = k++;
                                System.out.println("arr["+y+"]["+x+"]="+arr[y][x]+"\t");
                        }
                        System.out.println();
            x++;

            //把左边存入数组中
                    for(y = (n- 1) - i - 1;y >= i + 1;y--)
                        {
                                arr[y][x] = k;
                                System.out.println("arr["+y+"]["+x+"]="+arr[y][x]+"\t");
                                k++;
                        }
                        System.out.println();
            y++;               
                }
               
        }

        public static void printArray(int [][] arr)
        {
                int n = arr.length;//获取矩阵的阶数
                for(int i = 0;i < n;i++ )
                {
                        for(int j = 0;j < n;j++)
                        {
                                System.out.print(arr[i][j]+"\t");
                        }
                        System.out.println();
                }
        }

}



老师给的算法:(不一样的思路,条条大路通罗马啊!大家研究研究!)
                int SIZE = 5;
                int arr[][] = new int[SIZE][SIZE];
                int i, j, k = 0, n, m;
                n = SIZE;
                m = (n + 1) / 2;
                for (i = 0; i < n; i++) {
                        // 顶边,从左到右,行不变列变
                        for (j = i; j <= n - i - 1; j++)
                                arr[i][j] = ++k;// 输出1、2、3、4、13、14
                       
                        // 右边,从上到下,行变列不变
                        for (j = i + 1; j <= n - i - 1; j++)
                                arr[j][n - i - 1] = ++k; // 输出5、6、7、15
                       
                        // 底边,从右到左,行不变列变
                        for (j = n - i - 2; j >= i; j--)
                                arr[n - i - 1][j] = ++k; // 输出8、9、10、16
                       
                        // 左边,从下到上,行变列不变
                        for (j = n - i - 2; j >= i + 1; j--)
                                arr[j][i] = ++k; // 输出11、12
                }
                for (i = 0; i < n; i++) {
                        for (j = 0; j < n; j++)
                                System.out.print(arr[i][j] + "\t");
                        System.out.println("");
                }


处女贴呦!!!自己亲手做的,太不容易啦!!!求过求技术分!!!




































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