博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程题之--打印二维螺旋矩阵
阅读量:4608 次
发布时间:2019-06-09

本文共 2459 字,大约阅读时间需要 8 分钟。

当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) V28         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而不是layerSize40         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, |

 

转载于:https://www.cnblogs.com/tlz888/p/7096900.html

你可能感兴趣的文章
HDU 1890--Robotic Sort(Splay Tree)
查看>>
connection string for Excel/Access 2010
查看>>
【转】【Python】Python中的__init__.py与模块导入(from import 找不到模块的问题)
查看>>
学习wavenet_vocoder之环境配置
查看>>
常用Maven命令
查看>>
Docker启动mysql的坑2
查看>>
JS中的对象数组
查看>>
j2ee爬坑行之二 servlet
查看>>
JAVA基础入门(JDK、eclipse下载安装)
查看>>
最基础的applet运用--在applet上画线
查看>>
布局大全
查看>>
eclipse中安装tomcat插件
查看>>
常见设计模式C++代码实现
查看>>
C++线程同步的四种方式(Windows)
查看>>
前端面试集锦(1)
查看>>
What are Upgrade, Product and Package Codes used for? By pusu
查看>>
【转】梯度下降算法以及其Python实现
查看>>
H5的本地存储
查看>>
1035 Password (20 分)
查看>>
VC静态连接库注意事项
查看>>