ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何生成单偶阶魔方阵?

如何生成单偶阶魔方阵?

作者:绿色风 分类: 时间:2022-08-17 浏览:122
楼主
liuguansky
Q:如何生成单偶阶魔方阵?[即魔方阶数为4N+2形式]
A:依罗伯填充法生成:

  1. Sub justtest() '单偶阶魔方[罗伯法]
  2.   Dim arr() As Long, n&, i&, m&, j&, row&, col&, arrre() As Long, k&
  3.   s = Application.InputBox("请输入单偶整数即4N+2形式", "4N+2整数输入:", 10)
  4.   If s Mod 4 = 2 Then
  5.     n = s / 2
  6.     ReDim arr(1 To n, 1 To n)
  7.     i = 1: m = n ^ 2: row = 1: col = (n + 1) / 2
  8.     Do While i <= m
  9.       If row = 0 Then row = n
  10.       If col = n + 1 Then col = 1
  11.       arr(row, col) = i
  12.       If i Mod n = 0 Then
  13.         row = row + 1
  14.         Else
  15.         row = row - 1
  16.         col = col + 1
  17.       End If
  18.       i = i + 1
  19.     Loop
  20.     ReDim arrre(1 To s, 1 To s)
  21.       For i = 1 To s
  22.         For j = 1 To s
  23.         arrre(i, j) = arr((i - 1) Mod n + 1, (j - 1) Mod n + 1) + IIf(i > n Or j > n, (2 - IIf(j > n, 1, -1) + IIf(i <= n, 1, 0)) * n ^ 2, 0)
  24.       Next j, i
  25.      For i = 1 To n
  26.       For j = 1 To n
  27.         If (j < n / 2 And i <> (n + 1) / 2) Or (j > n / 2 And j < n And i = (n + 1) / 2) Then
  28.           k = arrre(i, j)
  29.           arrre(i, j) = arrre(i + n, j)
  30.           arrre(i + n, j) = k
  31.         End If
  32.     Next j, i
  33.     u = (n - 1) / 2
  34.     If u > 1 Then
  35.      For i = 1 To n
  36.         For j = n + 2 To n + u
  37.        k = arrre(i, j)
  38.        arrre(i, j) = arrre(i + n, j)
  39.       arrre(i + n, j) = k
  40.       Next j, i
  41.    End If
  42.     Cells.Clear
  43.     With Cells(1, 1).Resize(s, s)
  44.       .Value = arrre
  45.     End With
  46.     Else: Exit Sub
  47.   End If
  48.   With Cells(1, 1) '验证结果
  49.     .Offset(s + 1, 0).Resize(1, s) = "=sum(r[-" & s + 1 & "]c:r[-1]c)"
  50.     .Offset(0, s + 1).Resize(s, 1) = "=sum(rc[-" & s + 1 & "]:rc[-1])"
  51.     For i = 1 To s
  52.       For j = 1 To s
  53.         If i = j Then .Offset(s, s) = .Offset(s, s) + arrre(i, j)
  54.         If i + j = s + 1 Then .Offset(s + 1, s + 1) = .Offset(s + 1, s + 1) + arrre(i, j)
  55.     Next j, i
  56.     .Resize(1, s + 2).EntireColumn.AutoFit
  57.   End With
  58. End Sub

2楼
herelazy
学习啦,谢谢分享!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap