zoukankan      html  css  js  c++  java
  • 编程题之--打印二维螺旋矩阵

    当size=4时, 二维螺旋矩阵如下图所示:

    规律总结

      可以把这个二维矩阵看成一层套一层,如上图所示,1->4->7->10->12为第零层,

    13->14->15->16为第一层,所以当size=4时,总共有两层。规律如下:

    1. 可分层数为:若size为偶数,层数=size/2, 若为奇数,则层数=(size+1)/2;
    2. 第n层一个方向上的数字的数量为:size-2*n;

      这是因为第零层的一个方向上数字的数量就是size, 而第一层是size-2,...第n层就是size-2*n;

    3. 第n层上数字的数量为4*(size-2*n) - 4,这里的size-2*n就是(2)中一个方向上的数字的数量。

      由此推知,若第n层的第一个数字为x,则第n+1层的第一个数字为x+4*(size-2*n)- 4,

      例如4*4矩阵中,第0层的第一个数字为1, 则第1层的第一个数字为1 + 4 * 4 - 4 = 13。

    代码

    有了以上的规律,就可以写代码了,博主的代码如下,供参考。

    其中,在填充每一层的数字时,下,左,上都重复了第一个数字,并且要注意的是,最后向上的一步不能覆盖这一层的首数字

    具体以本文开头的那个图为例,第零层填充顺序就是:

            右:1,2,3,4,;

            下:4,5,6,7

            左:7,8,9,10

            上:10,11,12。

    向上的如果在写成:10, 11, 12, 13就把开头的数字1给冲掉了。

     1 public class SnakeArray {
     2 
     3     public static int[][] fillSnakeArray(int size) {
     4         int[][] sa = new int[size][size];
     5         int startEle = 1;
     6         int layerNum = (size % 2 == 0) ? size / 2 : (size + 1) / 2;
     7         for (int layer = 0; layer < layerNum; layer++) {
     8             fillLayer(size, startEle, layer, sa);
     9             int sizeInLayer = size - 2 * layer;
    10             startEle += 4 * (sizeInLayer - 1);
    11         }
    12         return sa;
    13     }
    14 
    15     public static void fillLayer(int size, int startEle, int layer, int[][] sa) {
    16         int layerSize = size - 2 * layer;
    17         int eleTmp = startEle;
    18 
    19         int row = layer;
    20         int col = layer;
    21         //(1) >
    22         for (int i = 0; i < layerSize; i++) {
    23             sa[row][col++] = eleTmp++;
    24         }
    25         col -= 1;
    26         eleTmp -= 1;
    27         //(2) V
    28         for (int i = 0; i < layerSize; i++) {
    29             sa[row++][col] = eleTmp++;
    30         }
    31         row -= 1;
    32         eleTmp -= 1;
    33         //(3) <
    34         for (int i = 0; i < layerSize; i++) {
    35             sa[row][col--] = eleTmp++;
    36         }
    37         col += 1;
    38         eleTmp -= 1;
    39         //(4) ^ 防止覆盖这一层的第一个数字,循环到layerSize-1而不是layerSize
    40         for (int i = 0; i < layerSize - 1; i++) {
    41             sa[row--][col] = eleTmp++;
    42         }
    43     }
    44 
    45     public static void main(String[] args) {
    46         int n = 5;
    47         int[][] sa = fillSnakeArray(n);
    48         for (int i = 0; i < n; i++) {
    49             for (int j = 0; j < n; j++) {
    50                 System.out.print(sa[i][j] + ",");
    51             }
    52             System.out.println(" | ");
    53         }
    54     }
    55 }

     运行结果:

    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, | 
  • 相关阅读:
    AIBigKaldi(十三)| Kaldi的三音子模型训练(下)(源码解析)
    AIBigKaldi(十二)| Kaldi的三音子模型训练(中)(源码解析)
    AIBigKaldi(十一)| Kaldi的三音子模型训练(上)(源码解析)
    AIBigKaldi(十)| Kaldi的thchs30实例(源码解析)
    AIBigKaldi(九)| Kaldi的解码搜索(源码解析)
    AIBigKaldi(八)| Kaldi的解码图构造(下)(源码解析)
    AIBigKaldi(七)| Kaldi的解码图构造(上)(源码解析)
    AIBigKaldi(六)| Kaldi的单音子模型训练(下)(源码解析)
    AIBigKaldi(五)| Kaldi的单音子模型训练(上)(源码解析)
    理解 Linux 的硬链接与软链接
  • 原文地址:https://www.cnblogs.com/tlz888/p/7096900.html
Copyright © 2011-2022 走看看