ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8069|回复: 27

[讨论] VBA通过二个题目加深对数组赋值的理解-----蛇形矩阵和螺旋矩阵,详情见附件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-28 15:47 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:数组集合和字典
VBA通过二个题目加深对数组赋值的理解-----蛇形矩阵和螺旋矩阵,详情见附件,答案会在面进行贴出
旋转.jpg
蛇形.jpg

数组的深入赋值.rar

3.83 KB, 下载次数: 191

TA的精华主题

TA的得分主题

发表于 2014-3-28 17:10 | 显示全部楼层
粗粗编一个,不一定是最优的
  1. Option Explicit

  2. Public Enum DirectionEnum
  3.     ToRight = 0
  4.     ToDown = 1
  5.     ToUp = 2
  6.     ToLeft = 3
  7. End Enum

  8. '蛇形
  9. Sub SnakeMatrix(X As Long, Y As Long, Optional Direction As DirectionEnum = 0)
  10.     Dim iX As Long
  11.     Dim iY As Long
  12.     Dim n As Long
  13.     Dim DT As DirectionEnum
  14.     ReDim mat(1 To X, 1 To Y) As Long
  15.     DT = Direction
  16.     iX = 1
  17.     iY = 1
  18.     n = 1
  19.     mat(1, 1) = 1
  20.     Do While n < X * Y
  21.         n = n + 1
  22.         If DT = 0 And (iY = 1 Or iX = X) Then
  23.             If iX < X Then
  24.                 iX = iX + 1
  25.             Else
  26.                 iY = iY + 1
  27.             End If
  28.             DT = 1
  29.         ElseIf DT = 1 And (iX = 1 Or iY = Y) Then
  30.             If iY < Y Then
  31.                 iY = iY + 1
  32.             Else
  33.                 iX = iX + 1
  34.             End If
  35.             DT = 0
  36.         ElseIf DT = 0 Then
  37.             iX = iX + 1
  38.             iY = iY - 1
  39.         ElseIf DT = 1 Then
  40.             iX = iX - 1
  41.             iY = iY + 1
  42.         End If
  43.         mat(iX, iY) = n
  44.     Loop

  45.     '显示
  46.     Dim TempTx As String
  47.     For iY = 1 To Y
  48.         For iX = 1 To X
  49.             Sheet1.Cells(iY, iX) = mat(iX, iY)
  50.         Next
  51.     Next
  52. End Sub



  53. '旋转
  54. Sub RevolveMatrix(X As Long, Y As Long, Optional Direction As DirectionEnum = 0)
  55.     Dim iX As Long
  56.     Dim iY As Long
  57.     Dim n As Long
  58.     Dim DT As DirectionEnum
  59.     ReDim mat(1 To X, 1 To Y) As Long
  60.     DT = Direction
  61.     iX = 1
  62.     iY = 1
  63.     n = 1
  64.     mat(1, 1) = 1
  65.     Do While n < X * Y
  66.         n = n + 1
  67.         Select Case DT
  68.             Case 0
  69.                 If iX = X Then
  70.                     iY = iY + 1
  71.                     DT = ToDown
  72.                 Else
  73.                     If mat(iX + 1, iY) = 0 Then
  74.                         iX = iX + 1
  75.                     Else
  76.                         iY = iY + 1
  77.                         DT = ToDown
  78.                     End If
  79.                 End If
  80.             Case 1
  81.                 If iY = Y Then
  82.                     iX = iX - 1
  83.                     DT = ToLeft
  84.                 Else
  85.                     If mat(iX, iY + 1) = 0 Then
  86.                         iY = iY + 1
  87.                     Else
  88.                         iX = iX - 1
  89.                         DT = ToLeft
  90.                     End If
  91.                 End If
  92.             Case 2
  93.                 If iY = 1 Then
  94.                     iX = iX + 1
  95.                     DT = ToRight
  96.                 Else
  97.                     If mat(iX, iY - 1) = 0 Then
  98.                         iY = iY - 1
  99.                     Else
  100.                     iX = iX + 1
  101.                     DT = ToRight
  102.                     End If
  103.                 End If
  104.             Case 3
  105.                 If iX = 1 Then
  106.                     iY = iY - 1
  107.                     DT = ToUp
  108.                 Else
  109.                     If mat(iX - 1, iY) = 0 Then
  110.                         iX = iX - 1
  111.                     Else
  112.                         iY = iY - 1
  113.                         DT = ToUp
  114.                     End If
  115.                 End If
  116.         End Select
  117.         Debug.Print iX & "   " & iY
  118.         mat(iX, iY) = n
  119.     Loop

  120.     '显示
  121.     Dim TempTx As String
  122.     For iY = 1 To Y
  123.         For iX = 1 To X
  124.             Sheet1.Cells(iY, iX) = mat(iX, iY)
  125.         Next
  126.     Next
  127. End Sub
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-28 17:18 | 显示全部楼层
lsdongjh 发表于 2014-3-28 17:10
粗粗编一个,不一定是最优的

多谢支持,还可以再精减一些

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-28 18:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
呵呵,简单的算法,自己再顶一个

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-29 13:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-3-29 13:36 | 显示全部楼层
参与的人不多呢,楼主直接上答案好了呢。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-29 15:59 | 显示全部楼层
汗~~没什么意思,都没几个人参与。。。我就贴一段蛇形那个的代码。。。算是抛砖引玉吧。。。
  1. '蛇形矩阵
  2. Sub test()
  3. Dim arr()
  4. Cells.Clear
  5. n = InputBox("Please Enter an Integer:", "Inputbox") * 1
  6. k = 1: i = 1
  7. ReDim arr(1 To n, 1 To n)
  8. Do While i <= n
  9.     j = 1
  10.     Do While j <= i
  11.         If i Mod 2 = 0 Then
  12.             arr(i + 1 - j, j) = k
  13.             arr(n + j - i, n + 1 - j) = n ^ 2 + 1 - k
  14.         Else
  15.             arr(j, i + 1 - j) = k
  16.             arr(n + 1 - j, n + j - i) = n ^ 2 + 1 - k
  17.         End If
  18.         k = k + 1
  19.         j = j + 1
  20.     Loop
  21.     i = i + 1
  22. Loop
  23. Range("A1").Resize(n, n) = arr
  24. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-3-29 17:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1. 螺旋形有两种,一种从外向里、一种从里向外。

当然如果考虑螺旋方向就会更多种,但如果思路清晰了,方向很容易改,所以方向不同不算新问题。

2. 蛇行就更多了,楼主那种是斜的,
其实更简单的蛇行是:
奇数行 从左到右,
偶数行 从右到左。

总之是连起来的贪吃蛇。

额呵呵





TA的精华主题

TA的得分主题

发表于 2014-3-29 17:55 | 显示全部楼层
我以前解了一个【一笔画覆盖点阵】的题目,

其中一种就是从外向里进行螺旋。

因为要画图和画线,所以代码稍稍复杂了一点。
请看附件。

只要输出数组结果应该代码会简单一些,有空改写一下。

CycleLine.zip

43.16 KB, 下载次数: 101

TA的精华主题

TA的得分主题

发表于 2014-3-29 18:09 | 显示全部楼层
本帖最后由 香川群子 于 2014-3-29 18:32 编辑

我出的【左右蛇行】题目的代码非常简单。

  1. Sub 左右蛇行() 'by kagawa
  2.     Dim h&, i&, j&, k&, l&, m&, n&
  3.     l = InputBox("列数l=")
  4.     m = InputBox("总数m=")
  5.     h = (m - 1) \ l + 1 '计算行数
  6.     ReDim d(h - 1, l - 1)
  7.     For i = 0 To h - 1
  8.         For j = 0 To l - 1
  9.             If m Then d(i, IIf(i Mod 2, l - j - 1, j)) = i * l + j + 1: m = m - 1 Else Exit For
  10.             '计算直到m=0时停止
  11.         Next
  12.     Next
  13.     [a1].CurrentRegion = ""
  14.     [a1].Resize(h, l) = d
  15. End Sub
复制代码
事实上一句代码就解决了。→ 数组的行列位置计算是很见功力的。

IIf(i Mod 2, l - j - 1, j) → 偶数行时按照 l-j-1倒序写入、奇数行时按照 j 正序写入即可。

由于数组从0开始,所以 i mod 2 =0 在这里是奇数行、而 i mod 2 = 1 却是偶数行了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 21:42 , Processed in 0.042495 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表