编程题之打印二维螺旋矩阵

当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, | 
时间: 2024-08-06 17:08:26

编程题之打印二维螺旋矩阵的相关文章

编程题:用二维字符串数组实现。从键盘输入三个学生姓名,并输出。

#include<stdio.h> #include<string.h> void main() { char name[3][30]; int i; for(i=0;i<3;i++) gets(name[i]);  /*name[i]是一个一维字符数组*/ for(i=0;i<3;i++) printf("%s\n",name[i]); } 编程题:用二维字符串数组实现.从键盘输入三个学生姓名,并输出.,布布扣,bubuko.com

编程题:指向二维数组元素的指针变量。功能:已知二维数组a[2][3],输入输出全部元素。

#include<stdio.h> void main() { int a[2][3],i,j; int *p; /*用坐标法输入二维数组元素*/ for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); /*用指针法输出二维数组元素*/ p=a[0];         /*等价于p&a[0][0];*/ for(;p<a[0]+6;p++)   printf("%4d&quo

顺时针和逆时针螺旋打印二维数组(行列式)

一.要求: 行列式,行和宽不一定相等,要求顺时针螺旋打印每一个元素,所谓顺时针螺旋即: 第一圈:从第一行第一列元素开始,先从左到右打印第一行所有元素,接着打印最后一剩余列元素,再从右到左打印最后一行剩余元素,接着从下到上打印第一列剩余元素 第二圈:从第二行第二列开始,按上面的顺时针顺序打印一圈元素 ...,一圈圈反复,直到把所有元素无重复的打印完. 逆时针螺旋与上面的顺序刚好相反. 二.分析: 顺时针螺旋打印可以将问题分割为:先按顺时针打印第一圈,再按顺时针打印第二圈,其中每圈又分四个步骤:从左

Java生成并打印二维码

本次做订餐系统中,需要用到在Java生成二维码,并在jsp页面打印并输出,其中在action中生成二维码. 关键代码如下 1 public void reWeiMa() throws Exception{ 2 //设置页面不缓存 3 HttpServletResponse response = ServletActionContext.getResponse(); 4 HttpServletRequest quest = ServletActionContext.getRequest(); 5

一个for循环打印二维数组

#include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { int Arr[MAXX][MAXY] = {1,2,3,4,5,6}; for(int i = 0;i< MAXX*MAXY;i++) { printf("%d\n",Arr[i/MAXY][i%MAXY]); ///注意,一直没管MAXX什么事,在计算这一类的时候,最容易出问题 } } 一个for循环打印二维数组

Lodop打印二维码内容长度不同如何大小相同

利用Loodop打印控件打印二维码的时候,往往传入的数值是变量,有的只有一个数字,有的却一大堆数字和字母,根据内容长度不同,二维码大小也不同,这样如果批量打印二维码标签,传入的数据是不同的,会造成有的标签二维码大,有的二维码小的状况.出现这种状况,是因为Lodop中默认输出二维码的版本是AUTO(自动),这会导致随着二维码中的数据量不同,二维码大小也会不同.如果想把所有二维码设置成同一大小,解决方法是用语句指定同一个版本.例如:每个二维码加上相同的版本,LODOP.SET_PRINT_STYLE

vue项目中批量打印二维码

前提:项目中要打印的二维码为后台返回,批量选择后,点击打印,先打开二维码预览界面,再执行打印. 以下代码中 codePicList为选中的二维码数组.重点css:page-break-after:always 在元素后插入分页符;在打印时,要分页(需求是每个二维码打印在一张纸上) // 此代码为浏览界面遍历出来的要打印的多个二维码<ul id="codeImgviewer" v-if="codePicList != null && codePicList

vue常用插件之打印功能、二维码插件、批量打印二维码

vue实现打印的两种方法 vue实现批量打印二维码 (需安装二维码插件qrcodejs2) 一.vue-print-nb插件 1.安装: npm i vue-print-nb -S 2.全局注册(main.js): import Print from 'vue-print-nb' Vue.use(Print) 3.使用: <div id="printTest" > <p>锄禾日当午</p> <p>汗滴禾下土 </p> <

螺旋打印二维数组

void main() {         // 初始的区间坐标     int startX = 0, endX = 4;     int startY = 0, endY = 5;          while(startX<=endX && startY<=endY)  // 循环条件     {         int i;         for(i=startX; i<=endX; i++)  // 输出上边的行             cout <&l