摘要 螺旋矩阵和蛇型矩阵,是两个比较有趣的矩阵,有许多的公司面试题中有出现,这两个题的答案也有许多种,简单问一下度娘,就各自有N种实现,但是整个看下来,呵呵,比较顺眼的比较少。 考虑到不同的语言有不同的语言特性,因此今天就只用Java来进行实现,看看螺旋矩阵和蛇型矩阵的悠然版实现。
螺旋矩阵和蛇型矩阵,是两个比较有趣的矩阵,有许多的公司面试题中有出现,这两个题的答案也有许多种,简单问一下度娘,就各自有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 spiralMatrix[][] = new int[n][n]; for (int num = 1, x = 0, y = 0, xDir = 1, yDir = 0; num <= n * n; num++) { spiralMatrix[x][y] = num; if (x + xDir < 0 || y + yDir < 0 || x + xDir == n || y + yDir == n || spiralMatrix[x + xDir][y + yDir] != 0) {//如果到边界了就换方向 if (xDir != 0) { yDir = xDir; xDir = 0; } else { xDir = -yDir; yDir = 0; } } x += xDir; y += yDir; } return spiralMatrix; } 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 || spiralMatrix[x + xDir][y + yDir] != 0)
这里的意思是,如果要出边界(一共有4个边界),或者碰到前面的格子中有数字的时候就调整一下方便。
if (xDir != 0) { yDir = xDir; xDir = 0; } else { xDir = -yDir; yDir = 0; }
当然,如果没有碰到边界也没有碰到前面格子有数字,那就不调整方向,让它继续走,如下。
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 (int num = 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; }
这里就是上面说的逻辑的实现。
嗯嗯,这里的判断多了些,暂时没有想到如何进行优化,哪位同学出手优化一下?
总结
自此,悠然版螺旋矩阵和蛇形矩阵就完成了。
欢迎登录关注:http://bbs.tinygroup.org,本例涉及的代码和框架资料,将会在论坛分享。技术交流群:228977971,让我们一起动手,了解框架的奥秘!
相关推荐
这里的“悠然乱弹”可能是指作者以轻松幽默的方式讨论技术话题,比如螺旋矩阵和蛇型矩阵的实现。这些内容可能并不是书中主要介绍的技术细节,而是穿插在书中,作为技术讨论之外的调剂。 4. 未分类: 这一部分可能...
标题中的“对话框乱弹的小程序源码”指的是一个编程项目,它利用MFC(Microsoft Foundation Classes)库在VC++环境中编写,目的是创建一个整人性质的程序。这个小程序一旦运行,用户点击“开始”按钮后,会在Windows...
钢琴作为一种极具表现力的乐器,它所承载的情感和艺术价值历来受到音乐爱好者的推崇。《乱弹爱丽丝》便是这样一个深受音乐爱好者喜爱的钢琴曲目。它不仅拥有优美动听的旋律,还蕴含了一种自由即兴的演奏精神,赋予了...
在`QuickActionBar`这个文件中,可能包含了实现快速索引的自定义View类,你可以查看其源代码来学习如何处理触摸事件和改变视图状态。通过深入理解这些知识点,你就能实现一个与微信通讯录类似的快速索引功能。在实际...
这篇论文《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》深入探讨了在新媒体环境下,广播娱乐节目如何适应和利用新媒介特性,实现自身内容创新与传播效果的提升。通过对FM101...
《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》这篇文档探讨了在新媒体环境下广播娱乐节目编辑的新特点,以陕西地方电台“刘翔来了”为例进行深入分析。广播节目在传统媒介...
使用fiddler工具进行抓包,使用python进行osc乱弹抢沙发
传统企业面临着前所未有的挑战和机遇,如何在变革的大潮中找到自己的位置,实现成功转型并与互联网紧密结合,是当前众多企业家和管理者必须思考的问题。康国庆在into沙龙的分享中,探讨了这一主题,旨在为传统企业...
文档中还提到了一些提供工具和资源的网站,如织梦乱弹,它提供了关于网页设计和开发的各种资源和工具。 【总结】 这个文档是一份详尽的免费教程网站列表,对于想在网络技术、设计、编程等领域自我提升的个人来说,...
此外,像织梦乱弹和理想帝国这类网站提供了DW、FW、PS、FL等工具的插件、滤镜、字体、样式以及JS、ASP、PHP、DHTML等技术的教程和资源。 【综合学习平台与资源分享】 一些综合性的学习平台,如3D壁纸和模型下载...
《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》.zip
8. 乱弹戏曲:乱弹是河北的传统戏曲艺术形式,历史悠久,是当地人民的文化遗产,也是中国戏曲的重要组成部分。 以上知识点涵盖了金融交易、行政职务、合同法、职业道德、公务员制度、信用消费、个人隐私权以及传统...
本教程将详细讲解如何利用`GestureDetector`来实现一个页面滑动的Demo。 首先,我们需要了解`GestureDetector`的基本结构。`GestureDetector`主要包含两个核心接口:`OnGestureListener`和`OnDoubleTapListener`。`...
经历了数月艰苦的开放和程序员最痛苦的测试,今天,世上最强,最完善,最稳定和测试最充分,文档最完整的旗舰版和平之翼Java通用代码生成器SMEU 3.2.0 正式版乌篷船盛装发布了。欢迎大家下载使用。 请至本项目码云...
在早期,Ajax的实现依赖于iframe和JavaScript的top.Function调用来实现远程脚本加载,这种方法虽然简单,但在后期维护和跨域处理上存在诸多困难。XMLHttpRequest对象的诞生,让Ajax的开发变得更加简洁,但各浏览器...
冀东的地域文化深厚,自然资源丰富,如红色旅游景点和历史文化资源的开发,如大境门、避暑山庄、鸡鸣驿等,结合现代文化元素,形成了独特的文化旅游产业,为市场提供了多样化的文化服务,实现了经济效益和社会影响力...
本教程将详细讲解如何利用ViewPager和RadioGroup组件来实现一个基本的微信UI框架,以便后续扩展更多的功能。 首先,我们要了解`ViewPager`。ViewPager是Android SDK中的一个控件,它允许用户左右滑动来浏览多个页面...
修复单类代码生成器4个问题。 2.新增创建加载数据库时,表名过滤功能。 3.表名生成命名规则,字符串替换功能。 4.模板中字段排序方法公开。 5.字段默认值函数的处理。 6.导出的sql脚本中,单引号 '的问题。...