Java for 螺旋矩阵和蛇型矩阵

螺旋矩阵和蛇型矩阵,是两个比较有趣的矩阵问题,这两个问题的答案也有许多种,简单问一下Baidu,就各自有N种实现,来源也非常丰富,比如CSDN、ITEYE、等等,当然也包括著名的OSC,但是整体看下来,比较顺眼的比较少,比较经典的就越发少了。

考虑到不同的语言有不同的语言特性,因此今天就用Java来进行实现,看看螺旋矩阵和蛇型矩阵的悠然版实现,让我们的OSC也更加高大上一些。

概念说明

什么是螺旋矩阵

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,

向左变大,向上变大,如此循环。

下面是几个螺旋矩阵的示例:

下面是1阶螺旋矩阵:

1

下面是2阶螺旋矩阵:

1   2

4   3

下面是3阶螺旋矩阵:

1   2   3

8   9   4

7   6   5

下面是4阶螺旋矩阵:

1   2   3   4

12  13  14   5

11  16  15   6

10   9   8   7

下面是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

什么是蛇型矩阵

蛇型矩阵,这个东东说起来比较抽象,玩过贪吃蛇么?如果玩过大致就可以理解了。

下面看看实际示例

下面是1阶蛇形矩阵:

1

下面是2阶蛇形矩阵:

1   3

2   4

下面是3阶蛇形矩阵:

1   3   4

2   5   8

6   7   9

下面是4阶蛇形矩阵:

1   3   4  10

2   5   9  11

6   8  12  15

7  13  14  16

下面是5阶蛇形矩阵:

1   3   4  10  11

2   5   9  12  19

6   8  13  18  20

7  14  17  21  24

15  16  22  23  25

悠然版解法

螺旋矩阵

分析

简单看看螺旋矩阵,其规律就是一圈一圈的往里绕,因此我们可以想象有一条贪吃蛇,它很听话,如果要出格子或者碰到格子里有数的时候就向右转一下,然后在它路过的格子里顺序填充上数字就好

代码

public class SpiralMatrix {

public static int[][] spiralMatrix(int n){

int circleMatrix[][] = new int[n][n];

for(int num = 1, x=0,y=0,xDir = 1,yDir = 0; num <= n*n ; num++){

circleMatrix[x][y] = num;

if(x + xDir <0 || y + yDir<0 || x + xDir == n || y + yDir == n || circleMatrix[x + xDir][y + yDir] !=0){//如果到边界了就换方向

if(xDir != 0){

yDir = xDir;

xDir = 0;

}else{

xDir = -yDir;

yDir = 0;

}

}

x += xDir;

y += yDir;

}

return circleMatrix;

}

public static void main(String[] args){

for(int num = 1; num < 6; num++){

int[][] result = spiralMatrix(num);

System.out.printf("下面是%s阶螺旋矩形:\n",num);

for (int i = 0; i < num; i++) {

for (int j = 0; j < num; j++) {

System.out.printf("%3s",result[j][i]);

}

System.out.println();

}

}

}

}

说明

for(int num =1, x =0, y =0, xDir =1, yDir =0; num <= n * n; num++)

这里其实很简单,只是为了省点代码行数,因此把一些变量声明放这里了,实际放在外面更合适。

x,y为贪吃蛇要走过的位置,默认从左上角走起;

xDir和yDir为行进的方向,默认是水平向右走。


if(x + xDir <0|| y + yDir <0|| x + xDir == n || y + yDir == n || circleMatrix[x + xDir][y + yDir] !=0)

这里的意思是,如果要出边界(一共有4个边界),或者碰到前面的格子中有数字的意思。

if(xDir !=0) {

      yDir = xDir;

      xDir =0;

}else{

      xDir = -yDir;

      yDir =0;

}

下面是就调整一下方向。

    x += xDir;

     y += yDir;

当然,如果没有碰到边界也没有碰到前面格子有数字,那就不调整方向,让它继续走,如下。

    x += xDir;

    y += yDir;

然后,就没有然后了,然后贪吃蛇同学就帮我们完成了任务,来一个大点的看看?

1   2   3   4   5   6   7   8

28  29  30  31  32  33  34   9

27  48  49  50  51  52  35  10

26  47  60  61  62  53  36  11

25  46  59  64  63  54  37  12

24  45  58  57  56  55  38  13

23  44  43  42  41  40  39  14

22  21  20  19  18  17  16  15

蛇形矩阵

分析

简单看看蛇形矩阵,它的规律也很简单,只不过是如果走的规律变了一些,总结一下就是:贪吃蛇总是斜着走的,如果要走出边界,那么就换个方向走,只不过要走出左边时,就向下移动一个格子走;要走出上边时,就向右移动一个格子走;要走出下边格子时,就向右移动一个格子走,要走出右边格子时,就向下移动一个格子走;如果没有走出格子,就延着原来的方向走。

代码

public class SnakeMatrix {

     public static int[][] snakeMatrix(int n) {

          int snakeMatrix[][] =new int[n][n];

          for(intnum =1, x =0, y =0, xDir = -1, yDir =1;                  num <= n * n; num++) {

                  snakeMatrix[x][y] = num;

                  if(x + xDir == n) {

                           y += xDir;

                  }else if(y + yDir == n) {

                          x += yDir;

                 }else if(x + xDir <0) {

                           y += yDir;

                }else if(y + yDir <0) {

                          x += xDir;

               }else{//其它正常转向

                         x += xDir;

                         y += yDir;

                         continue;

             }

             xDir = -xDir;

             yDir = -yDir;

            }

           return snakeMatrix;

}

public static void main(String[] args) {

     for(int num =1; num <6; num++) {

           int[][] result = snakeMatrix(num);

           System.out.printf("下面是%s阶蛇形矩阵:\n", num);

           for(int i =0; i < num; i++) {

                 for(int j =0; j < num; j++) {

                 System.out.printf("%3s ", result[j][i]);

            }

            System.out.println();

       }

    }

  }

}

说明

if(x + xDir == n) {

       y += xDir;

}else if(y + yDir == n) {

       x += yDir;

}else if(x + xDir <0) {

      y += yDir;

}else if(y + yDir <0) {

     x += xDir;

}else{//其它正常转向

     x += xDir;

     y += yDir;

    continue;

}

这里就是上面说的逻辑的实现。

嗯嗯,这里的判断多了些,暂时没有想到如何进行优化,哪位同学出手优化一下?

总结

自此,悠然版螺旋矩阵和蛇形矩阵就完成了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容