ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 世界最难的数组怎么赋值

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-2-13 09:38 | 显示全部楼层
QQ截图20190213093335.jpg
1.rar (16.05 KB, 下载次数: 2)

网上好像很多是要求移动一根,所以就只做移动一根的情况。
没多试,不知可以吗




Sub test()
    Dim A, x, y, i, j, n
    A = Range("a1").CurrentRegion
    x = InputBox("移动一根火柴,使其成立", "提示", "6+4=4")
'    x = InputBox("移动一根火柴,使其成立", "提示", "6+4=4")
    y = x

    For i = 1 To Len(x)
        n = Mid(x, i, 1)
        If IsNumeric(n) Then n = CInt(n)
        For j = 1 To UBound(A)
            If n = A(j, 1) Then
                Mid(y, i, Len(A(j, 2))) = A(j, 2)
                If Application.Evaluate(y) Then MsgBox y: End
                y = x
            End If
        Next j
    Next i
    MsgBox "快去请如来佛祖!"
End Sub

TA的精华主题

TA的得分主题

发表于 2019-2-13 10:16 | 显示全部楼层
6+4=4
答案1,5+4=9
答案2,0+4=4
答案3,8-4=4


我的方法不对,再想下

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-13 10:39 | 显示全部楼层
爱疯 发表于 2019-2-13 09:38
网上好像很多是要求移动一根,所以就只做移动一根的情况。
没多试,不知可以吗

老师,你这只看移动的,好像行,那还有一个数增加,另一个数减少的呢?没考虑上。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-13 10:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 dongdonggege 于 2019-2-13 10:44 编辑
爱疯 发表于 2019-2-13 09:38
网上好像很多是要求移动一根,所以就只做移动一根的情况。
没多试,不知可以吗

另外两位数的好像不行。

TA的精华主题

TA的得分主题

发表于 2019-2-13 10:58 | 显示全部楼层
爱疯 发表于 2019-2-13 10:16
6+4=4
答案1,5+4=9
答案2,0+4=4

答案1,比原来多了一根火柴。答案23好像是对的。

先把游戏规则定好。是移动一根火柴,然后等式成立;还是3种情况,移动一根,或者增加一根,或者减少一根。还有就是数字可不可以两位数,两位数就复杂指数倍了。

加号减号等号也就罢了,除号和乘号算几根火柴,不知道怎么算啊,乘号是斜的,那移动一根就后是除?还是错误?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-13 11:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 dongdonggege 于 2019-2-13 11:21 编辑
micch 发表于 2019-2-13 10:58
答案1,比原来多了一根火柴。答案23好像是对的。

先把游戏规则定好。是移动一根火柴,然后等式成立; ...

建议规则:(暂时所有数均为1位数)
1、按数位加减乘除,等式成立。
2、各数字变换(增加、减少、移动)方法见1楼。
3、各数字均按七段码8的形式组成。
4、运算符号,乘除号不能增加、减少、移动,加号、减号变换如1楼。
建议方法:
1、先把数组建立起来,好循环。
2、建立专有函数,方便循环,判断。
3、按照数位或顺序再去循环、判断,计算。

数字字符增减移动.zip

1.81 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2019-2-13 11:28 | 显示全部楼层
不考虑两位数,+号就不能变11了,+变11等号左边不是成了4位数了。

不过+能不能变等于?1+1=1  变1=1=1

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-13 12:59 | 显示全部楼层
micch 发表于 2019-2-13 11:28
不考虑两位数,+号就不能变11了,+变11等号左边不是成了4位数了。

不过+能不能变等于?1+1=1  变1=1=1

那你看规则怎么修改?

TA的精华主题

TA的得分主题

发表于 2019-2-13 16:20 | 显示全部楼层
dongdonggege 发表于 2019-2-13 12:59
那你看规则怎么修改?

个人理解,1应该是2根火柴组成吧,所以+移动一根只能变成1,而不是11(标准4根组成),又如,7应该是3根火柴...变化不应以“相似”成立,
+ 是2根火柴,- 是1 根,= 是2根,×= 是2根,/是1根,及各数字火柴根数应统一

TA的精华主题

TA的得分主题

发表于 2019-2-13 18:02 | 显示全部楼层
本帖最后由 micch 于 2019-2-13 18:59 编辑

思路不对,就费功夫,用循环做了一个,写的真长。结果除法的时候出现除0的错误,懒得改了,只做+-*的等式。列了一个增减变化的表,然后加入字典,循环判断; 1.jpg CCC.gif

  1. Sub match()
  2. Dim d, arr, ar, brr(9, 0), i%, n%, ss$, x, a, b
  3. Set d = CreateObject("Scripting.Dictionary")
  4. arr = [u2:y13]
  5.     For i = 1 To 12
  6.         d(arr(i, 1) & "+") = arr(i, 3)
  7.         d(arr(i, 1) & "-") = arr(i, 4)
  8.         d(arr(i, 1) & "c") = arr(i, 5)
  9.     Next
  10. ss = [f11]
  11. ss = Replace(Replace(ss, "x", "*"), "÷", "/")
  12.     For i = 1 To 5
  13.         x = Mid(ss, i, 1)
  14.         If x = "=" And Mid(ss, 2, 1) = "-" Then
  15.             eqs = Replace(Replace(ss, "=", "-"), "-", "=", , 1)
  16.             If Application.Evaluate(eqs) Then brr(n, 0) = eqs: n = n + 1
  17.         Else
  18.             If d(x & "c") <> "*" Then
  19.                 For Each a In Split(d(x & "c"), ",")
  20.                     eqs = Mid(Mid(" " & ss, 1, i) & Replace(ss, x, a, i, 1), 2)
  21.                     If Application.Evaluate(eqs) Then brr(n, 0) = Replace(eqs, "*", "x"): n = n + 1
  22.                 Next
  23.             End If
  24.             If d(x & "-") <> "*" Then
  25.                 For Each a In Split(d(x & "-"), ",")
  26.                     eqs = Mid(Mid(" " & ss, 1, i) & Replace(ss, x, a, i, 1), 2)
  27.                     For k = 1 To 5
  28.                         If k <> i And d(Mid(eqs, k, 1) & "+") <> "*" Then
  29.                             For Each b In Split(d(Mid(eqs, k, 1) & "+"), ",")
  30.                                 eqs2 = Mid(Mid(" " & eqs, 1, k) & Replace(eqs, Mid(eqs, k, 1), b, k, 1), 2)
  31.                                 If Application.Evaluate(eqs2) Then brr(n, 0) = Replace(eqs2, "*", "x"): n = n + 1
  32.                             Next b
  33.                         End If
  34.                     Next k
  35.                 Next a
  36.             End If
  37.         End If
  38.     Next i
  39. If n Then
  40.     [f13].Resize(9).ClearContents
  41.     [f13].Resize(n + 1) = brr
  42. Else
  43.     [f13].Resize(9).ClearContents
  44.     [f13] = "I can't do it!"
  45. End If
  46. End Sub
复制代码


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-9 21:58 , Processed in 0.049176 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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