A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 cat73 于 2015-8-13 14:18 编辑

看到别人用Java写,我就用JS做了个:http://bbs.itheima.com/thread-224667-1-1.html
我自己研究算法的时候喜欢用JS- -
原因是语法简单,不像Java需要那么多东西- -
以及不需要开IDE,浏览器即可调试OK上代码:
  1. !function() {
  2.     /**
  3.      * 输出螺旋数列
  4.      * @param size 要输出的矩阵的长与宽
  5.      * @param startNum 从哪个数字开始输出
  6.      * @param directions 方向列表,应该为正好包含4个整数的数组,1上2下3左4右
  7.      * @param startX 开始X坐标
  8.      * @param startY 开始Y坐标
  9.      */
  10.     function xxx(size, startNum, directions, startX, startY, numStep) {
  11.         // 初始化存储区域
  12.         var array = [];
  13.         for (var i = 0; i < size; i++) {
  14.             array[i] = [];
  15.         }

  16.         // 生成数字
  17.         var s = size;         // 当前的输出大小
  18.         var n = 1;            // 还有几次循环要减少输出大小
  19.         var directionID = 0;  // 当前输出方向
  20.         var x = startX;       // 当前的x坐标
  21.         var y = startY;       // 当前的y坐标
  22.         var num = startNum;   // 当前的数字
  23.         //首先对开始坐标进行修正
  24.         var firstDirection = directions[directionID];
  25.         if (firstDirection == 1) {
  26.             x++;
  27.         } else if (firstDirection == 2) {
  28.             x--;
  29.         } else if (firstDirection == 3) {
  30.             y++;
  31.         } else {
  32.             y--;
  33.         }
  34.         //主要输出循环
  35.         while (s > 0) {
  36.             // 生成一行或者一列数字
  37.             var direction = directions[directionID]; //本次输出的方向
  38.             for (var i = 0; i < s; i++) {
  39.                 // 首先根据方向计算出输出的目标坐标
  40.                 if (direction == 1) {
  41.                     x--;
  42.                 } else if (direction == 2) {
  43.                     x++;
  44.                 } else if (direction == 3) {
  45.                     y--;
  46.                 } else {
  47.                     y++;
  48.                 }

  49.                 // 然后将目标数字输出到指定坐标
  50.                 array[x][y] = num;
  51.                 num += numStep;
  52.             }

  53.             // 控制输出大小的缩小
  54.             n--;
  55.             if (!n) {
  56.                 n = 2;
  57.                 s--;
  58.             }
  59.             // 控制方向的更变
  60.             directionID++;
  61.             if (directionID == 4) {
  62.                 directionID = 0;
  63.             }
  64.         }
  65.         
  66.         // 准备结果
  67.         var result = "";
  68.         for (var i = 0; i < size; i++) {
  69.             for(var j = 0; j < size; j++) {
  70.                 result += array[i][j] + "\t";
  71.             }
  72.             result += "\n";
  73.         }

  74.         //返回结果
  75.         return result;
  76.     }

  77.     //演示: 顺时针输出
  78.     var str = xxx(10, 1, [4, 2, 3, 1], 0, 0, 1);
  79.     console.log(str);
  80.     //演示: 逆时针输出
  81.     var str = xxx(9, 1, [2, 4, 1, 3], 0, 0, 1);
  82.     console.log(str);
  83.     //演示: 从右下角开始的逆时针输出
  84.     var str = xxx(9, 1, [1, 3, 2, 4], 8, 8, 1);
  85.     console.log(str);
  86.     //演示: 从右上角开始的顺时针输出 从200开始每次减2
  87.     var str = xxx(9, 200, [2, 3, 1, 4], 0, 8, -2);
  88.     console.log(str);
  89. }();
复制代码

输出:
  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        

  11. 1        32        31        30        29        28        27        26        25        
  12. 2        33        56        55        54        53        52        51        24        
  13. 3        34        57        72        71        70        69        50        23        
  14. 4        35        58        73        80        79        68        49        22        
  15. 5        36        59        74        81        78        67        48        21        
  16. 6        37        60        75        76        77        66        47        20        
  17. 7        38        61        62        63        64        65        46        19        
  18. 8        39        40        41        42        43        44        45        18        
  19. 9        10        11        12        13        14        15        16        17        

  20. 17        16        15        14        13        12        11        10        9        
  21. 18        45        44        43        42        41        40        39        8        
  22. 19        46        65        64        63        62        61        38        7        
  23. 20        47        66        77        76        75        60        37        6        
  24. 21        48        67        78        81        74        59        36        5        
  25. 22        49        68        79        80        73        58        35        4        
  26. 23        50        69        70        71        72        57        34        3        
  27. 24        51        52        53        54        55        56        33        2        
  28. 25        26        27        28        29        30        31        32        1        

  29. 152        150        148        146        144        142        140        138        200        
  30. 154        100        98         96         94         92         90         136        198        
  31. 156        102        64         62         60         58         88         134        196        
  32. 158        104        66         44         42         56         86         132        194        
  33. 160        106        68         46         40         54         84         130        192        
  34. 162        108        70         48         50         52         82         128        190        
  35. 164        110        72         74         76         78         80         126        188        
  36. 166        112        114        116        118        120        122        124        186        
  37. 168        170        172        174        176        178        180        182        184
复制代码



1 个回复

倒序浏览
赞一个,不错不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马