ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 用错位排列原理填写九宫格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-10-7 08:19 | 显示全部楼层 |阅读模式
本帖最后由 dsmch 于 2012-10-7 21:34 编辑

以前用多重循环尝试过,最少要用4重循环,错位排列原理解决了用多重循环的麻烦,
九个单元格按从左到右、从上到下分别编号1-9,所得结果可按此顺序填写。发帖与大家分享
普及一下相关知识:所谓九宫格,就是把九个连续数字填入九个方格
以1-9为例:
每行相加均等于15,每列相加也等于15,对角线经过的单元格相加也等于15
如把第一个答案填入方格:



1.gif

错位排列.zip

7.11 KB, 下载次数: 185

TA的精华主题

TA的得分主题

发表于 2012-10-7 09:02 | 显示全部楼层
本帖最后由 bluexuemei 于 2012-10-7 09:03 编辑

运行结果:
276951438
294753618
438951276
492357816
618753294
672159834
816357492
834159672
不很明白你的意思.

TA的精华主题

TA的得分主题

发表于 2012-10-7 09:20 | 显示全部楼层
貌似LZ的意思是
2 7 6
9 5 1
4 3 8
一条直线的和为15

TA的精华主题

TA的得分主题

发表于 2012-10-7 09:23 | 显示全部楼层
还得多努力哦!同列重复值,且只能生成固定的一个结果。
整了个8×9宫格!并且,解决九宫格,起码应该有:选题、做题、解答!

点评

看来现在小学生常做的题目,大家都很陌生啊  发表于 2012-10-7 09:30

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-7 09:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 dsmch 于 2012-10-7 22:04 编辑

如数字12排列,则可排列为1、2;2、1
数字123排列,则可排列:
123
132
213
231
312
321




  1. Dim x
  2. Sub Macro1()
  3. x = 3
  4. aa "", 0
  5. End Sub
  6. Sub aa(a As String, s As Long)
  7. Dim i&
  8. If Len(a) = x Then
  9.     s = s + 1
  10.    Cells(s, 1) = a
  11. End If
  12. For i = 1 To x
  13.     If InStr(a, i) = 0 Then aa a & i, s
  14. Next
  15. End Sub
  16. 如x=5 ,结果如下:






  17. 12345

  18. 12354

  19. 12435

  20. 12453

  21. 12534

  22. 12543

  23. 13245

  24. 13254

  25. 13425

  26. 13452

  27. 13524

  28. 13542

  29. 14235

  30. 14253

  31. 14325

  32. 14352

  33. 14523

  34. 14532

  35. 15234

  36. 15243

  37. 15324

  38. 15342

  39. 15423

  40. 15432

  41. 21345

  42. 21354

  43. 21435

  44. 21453

  45. 21534

  46. 21543

  47. 23145

  48. 23154

  49. 23415

  50. 23451

  51. 23514

  52. 23541

  53. 24135

  54. 24153

  55. 24315

  56. 24351

  57. 24513

  58. 24531

  59. 25134

  60. 25143

  61. 25314

  62. 25341

  63. 25413

  64. 25431

  65. 31245

  66. 31254

  67. 31425

  68. 31452

  69. 31524

  70. 31542

  71. 32145

  72. 32154

  73. 32415

  74. 32451

  75. 32514

  76. 32541

  77. 34125

  78. 34152

  79. 34215

  80. 34251

  81. 34512

  82. 34521

  83. 35124

  84. 35142

  85. 35214

  86. 35241

  87. 35412

  88. 35421

  89. 41235

  90. 41253

  91. 41325

  92. 41352

  93. 41523

  94. 41532

  95. 42135

  96. 42153

  97. 42315

  98. 42351

  99. 42513

  100. 42531

  101. 43125

  102. 43152

  103. 43215

  104. 43251

  105. 43512

  106. 43521

  107. 45123

  108. 45132

  109. 45213

  110. 45231

  111. 45312

  112. 45321

  113. 51234

  114. 51243

  115. 51324

  116. 51342

  117. 51423

  118. 51432

  119. 52134

  120. 52143

  121. 52314

  122. 52341

  123. 52413

  124. 52431

  125. 53124

  126. 53142

  127. 53214

  128. 53241

  129. 53412

  130. 53421

  131. 54123

  132. 54132

  133. 54213

  134. 54231

  135. 54312

  136. 54321

复制代码

1.gif

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-7 21:50 | 显示全部楼层
本帖最后由 dsmch 于 2012-10-7 22:03 编辑

如果全排列:如数字12排列为:1、1;1、2;2、1;2.、2

  1. Dim x
  2. Sub Macro1()
  3. x = 3
  4. aa "", 0
  5. End Sub
  6. Sub aa(a As String, s As Long)
  7. Dim i&
  8. If Len(a) = x Then
  9.     s = s + 1
  10.    Cells(s, 1) = a
  11. End If
  12. For i = 1 To x
  13.     If Len(a) < x Then aa a & i, s
  14. Next
  15. End Sub

复制代码
以数字1,2,3 为例,结果为:
111
112
113
121
122
123
131
132
133
211
212
213
221
222
223
231
232
233
311
312
313
321
322
323
331
332
333


TA的精华主题

TA的得分主题

发表于 2012-11-10 23:46 | 显示全部楼层
是的九宫就是横竖斜相加都等于15,记得黄蓉说过
24为肩,68为足,左7右3,上9下1,5在中间,是其中的一种写法,
楼主的速度还有待提高,哈哈

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-11 00:00 | 显示全部楼层
是的,单元格赋值远不如数组一次赋值给单元格,刚接触这类写法,就写了个最简单的,方便记忆,其他的费点功夫都可补充。

TA的精华主题

TA的得分主题

发表于 2012-11-11 10:25 | 显示全部楼层
dsmch 发表于 2012-10-7 21:50
如果全排列:如数字12排列为:1、1;1、2;2、1;2.、2 以数字1,2,3 为例,结果为:
111
112

这个问题是典型香川组合的特殊型。

解释一下【香川组合】:

待组合对象元素是一个m行n列区域。举例,如2行3列:

a 1 甲
b 2 乙

组合要求:
结果仍为n列(3列),要求1-n的每1列中,各行(1-m)行的元素都依次出现,求所有不同组合。

附加要求,各列中元素不串列、不穿越。

结果为:
a,1,甲
a,1,乙
a,2,甲
a,2,乙
b,1,甲
b,1,乙
b,2,甲
b,2,乙

实际上,组合结果总数=第1列的m种组合,乘以第2列的m种组合,乘以第3列的m种组合……
即=m^n

当m=2,n=3时,组合结果总数=2^3=8

……分割线……

有比如,4行3列时,结果总数=4^3=64
a 1 甲
b 2 乙
c 3 丙
d 4 丁

上述组合方式,以前并没有人专门给予名称。所以我就把它命名为【香川组合】了。

……分割线……
楼主的问题,就是【香川组合】中的一个特殊形式:
如1,2,3 就相当于3行3列的下面元素排列,并求组合。组合总数=3^3=27个

1 1 1
2 2 2
3 3 3

结果为:

1,1,1
1,1,2
1,1,3
1,2,1
1,2,2
1,2,3
1,3,1
1,3,2
1,3,3
2,1,1
2,1,2
2,1,3
2,2,1
2,2,2
2,2,3
2,3,1
2,3,2
2,3,3
3,1,1
3,1,2
3,1,3
3,2,1
3,2,2
3,2,3
3,3,1
3,3,2
3,3,3

TA的精华主题

TA的得分主题

发表于 2012-11-11 10:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
通用的,对于m行n列区域元素进行【香川组合】排列的递归代码如下:
  1. Dim sj, jg(), m%, n%, k
  2. Sub 香川组合递归()
  3.     sj = [a1].CurrentRegion: m = UBound(sj): n = UBound(sj, 2): Amn = m ^ n
  4.     If Amn > 65536 Then Exit Sub Else ReDim jg(Amn, n): k = 0
  5.     Call dgMn("", 0)
  6.     [a1].offset(, n + 3).CurrentRegion = "": [a1].offset(, n + 1) = Amn: [a1].offset(, n + 3).Resize(Amn, n + 1) = jg
  7. End Sub
  8. Sub dgMn(s$, t%)
  9.     If t = n Then
  10.         p = Split(s, ";")
  11.         For j = 1 To n
  12.             jg(k, j) = sj(p(j), j)
  13.             jg(k, 0) = jg(k, 0) & ";" & sj(p(j), j)
  14.         Next
  15.         jg(k, 0) = Mid(jg(k, 0), 2): k = k + 1: Exit Sub
  16.     End If
  17.     For j = 1 To m
  18.         If sj(j, t + 1) <> "" Then Call dgMn(s & ";" & j, t + 1)
  19.     Next j
  20. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-23 21:08 , Processed in 0.054558 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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