黑马程序员技术交流社区

标题: 螺旋矩阵 [打印本页]

作者: 烨LEO    时间: 2015-8-13 00:16
标题: 螺旋矩阵
/*
输出 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  

*/

class XDemo
{
        public static void main(String[] args)
        {
                int SIZE = 5;
                int i,j,k=0,n;
                n = SIZE;
                int[][] arr = new int[SIZE][SIZE];
                for(i=0; i<n; i++)
                {
                        //顶层,从左到右,行不变列变
                        for(j=i;j<=n-i-1;j++)
                        {
                                arr[i][j] = ++k;//输出1,2,3,4,5,17,18,19,25
                        }
                        //右边,从上到下,行变列不变
                        for (j=i+1; j<=n-i-1; j++)
                        {
                                arr[j][n-i-1] = ++k; //输出6,7,8,9,20,21
                        }
                        //底边,从右到左,行不变列变
                        for (j=n-i-2; j>=i; j--)
                        {
                                arr[n-i-1][j] = ++k; //输出10,11,12,13,22,23
                        }
                        //左边,从下到上,行变列不变
                        for (j=n-i-2; j>=i+1; j--)
                        {
                                arr[j][i] = ++k;  //输出 14,15,16,24
                        }
                       
                }
                for (i=0; i<n; i++)
                {
                        for(j=0; j<n; j++)
                        {
                                System.out.print(arr[i][j] + "\t");
                        }
                        System.out.println();
                }
        }
}

作者: 13798223575    时间: 2015-8-13 00:41
这个题目起初让我好头痛
作者: 大漠孤星    时间: 2015-8-13 10:07
好牛逼哦!{:2_30:}
作者: 周飞飞    时间: 2015-8-13 10:10
6666666666666666666666666666666666
作者: 耀阳圣尊    时间: 2015-8-13 11:41
赞一个
作者: cat73    时间: 2015-8-13 13:36
本帖最后由 cat73 于 2015-8-13 13:54 编辑
  1. 1         2         3         4         5         6         7         8         9         10        
  2. 36        37        38        39        40        41        42        43        44        11        
  3. 35        64        65        66        67        68        69        70        45        12        
  4. 34        63        84        85        86        87        88        71        46        13        
  5. 33        62        83        96        97        98        89        72        47        14        
  6. 32        61        82        95        100       99        90        73        48        15        
  7. 31        60        81        94        93        92        91        74        49        16        
  8. 30        59        80        79        78        77        76        75        50        17        
  9. 29        58        57        56        55        54        53        52        51        18        
  10. 28        27        26        25        24        23        22        21        20        19        
复制代码

JS的代码- - 感觉算法题用JS更合适一些- -
  1. !function() {
  2.     // 螺旋数列
  3.     function xxx(size) {
  4.         // 初始化存储区域
  5.         var array = [];
  6.         for (var i = 0; i < size; i++) {
  7.             array[i] = [];
  8.         }

  9.         // 生成数字
  10.         var s = size;       // 当前的输出大小
  11.         var n = 1;          // 还有几次循环要减少输出大小
  12.         var direction = 1;  // 输出方向 1→ 2↓ 3← 4↑
  13.         var x = 0;          // 当前的x坐标
  14.         var y = -1;         // 当前的y坐标
  15.         var num = 1;        // 当前的数字
  16.         while (s > 0) {
  17.             // 生成一行或者一列数字
  18.             for (var i = 0; i < s; i++) {
  19.                 // 首先根据方向计算出输出的目标坐标
  20.                 if (direction == 1) {
  21.                     y++;
  22.                 } else if (direction == 2) {
  23.                     x++;
  24.                 } else if (direction == 3) {
  25.                     y--;
  26.                 } else {
  27.                     x--;
  28.                 }

  29.                 // 然后将目标数字输出到指定坐标
  30.                 array[x][y] = num++;
  31.             }

  32.             // 控制输出大小的缩小
  33.             n--;
  34.             if (!n) {
  35.                 n = 2;
  36.                 s--;
  37.             }
  38.             // 控制方向的更变
  39.             direction++;
  40.             if (direction == 5) {
  41.                 direction = 1;
  42.             }
  43.         }
  44.         
  45.         // 打印输出
  46.         var out = "";
  47.         for (var i = 0; i < size; i++) {
  48.             for(var j = 0; j < size; j++) {
  49.                 out += array[i][j] + "\t";
  50.             }
  51.             out += "\n";
  52.         }
  53.         console.log(out);
  54.     }

  55.     xxx(10);
  56. }();
复制代码

略微改下代码还可以实现逆时针输出
  1. 1        36        35        34        33        32        31        30        29        28        
  2. 2        37        64        63        62        61        60        59        58        27        
  3. 3        38        65        84        83        82        81        80        57        26        
  4. 4        39        66        85        96        95        94        79        56        25        
  5. 5        40        67        86        97        100       93        78        55        24        
  6. 6        41        68        87        98        99        92        77        54        23        
  7. 7        42        69        88        89        90        91        76        53        22        
  8. 8        43        70        71        72        73        74        75        52        21        
  9. 9        44        45        46        47        48        49        50        51        20        
  10. 10       11        12        13        14        15        16        17        18        19        
复制代码

由内向外
  1. 100       65        66        67        68        69        70        71        72        73        
  2. 99        64        37        38        39        40        41        42        43        74        
  3. 98        63        36        17        18        19        20        21        44        75        
  4. 97        62        35        16        5         6         7         22        45        76        
  5. 96        61        34        15        4         1         8         23        46        77        
  6. 95        60        33        14        3         2         9         24        47        78        
  7. 94        59        32        13        12        11        10        25        48        79        
  8. 93        58        31        30        29        28        27        26        49        80        
  9. 92        57        56        55        54        53        52        51        50        81        
  10. 91        90        89        88        87        86        85        84        83        82        
复制代码

作者: kenfans    时间: 2015-8-13 13:38
厉害,我前两天还在想这个题,没想到用二维数据这么简单就可以解了,哎厉害啊
作者: kenfans    时间: 2015-8-13 16:11
kenfans 发表于 2015-8-13 13:38
厉害,我前两天还在想这个题,没想到用二维数据这么简单就可以解了,哎厉害啊 ...

哎,我之前看别人写的螺旋矩阵,那算法复杂到不想看,还计算每一圈元素的个数。你这个解法还真没有想到
作者: 铿锵的小黑马    时间: 2015-8-13 21:16
           学会了 .. .
作者: CharnLau    时间: 2015-8-13 22:32
没必要定义size,直接int n = 5搞定!
作者: 陈cc    时间: 2015-8-13 23:02
cat73 发表于 2015-8-13 13:36
JS的代码- - 感觉算法题用JS更合适一些- -

略微改下代码还可以实现逆时针输出

6666666666666666666今天刚刚接触这个题。。头都爆炸了
作者: T-l-H、小生    时间: 2015-8-14 00:18
Jquery的有木有?
作者: bingo54    时间: 2015-8-14 23:48
cat73 发表于 2015-8-13 13:36
JS的代码- - 感觉算法题用JS更合适一些- -

略微改下代码还可以实现逆时针输出

66666666666666666




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