VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 7265|回复: 18

谁能写一个 猜数字游戏解算的算法,短小精悍

[复制链接]
发表于 2016-9-23 01:29:25 | 显示全部楼层 |阅读模式
先介绍一下猜数字 数字为四个数字不重复 比如 1234
如果猜 4567 就是数字正确但位置不对,结果 0A1B
根据这样的提示再猜 5674,结果 1A0B
就是这样,那时候文曲星里面就有这样的游戏

然后根据已有的数据 比如

  1. 1357 1A1B
  2. 1235 3A0B
  3. 1243 2A2B
  4. 1423 1A3B
复制代码
最快的计算出结果

本帖被以下淘专辑推荐:

 楼主| 发表于 2016-9-23 01:29:56 | 显示全部楼层

点评

其实我正在写,然后难倒了。  发表于 2016-9-23 01:30
回复 支持 反对

使用道具 举报

发表于 2016-9-23 09:38:07 | 显示全部楼层
本帖最后由 lowxiong 于 2016-9-23 10:27 编辑

解算,应该暴力最简单精悍吧。

点评

有次数的,最多10次,越少越好  发表于 2016-9-23 11:16
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-23 11:17:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2016-9-23 11:36:54 | 显示全部楼层
这个AI我认为需要各个击破,每个组合有不同的破解策略,如0A0B:划掉这4个数,接下来在剩下的6个数里组合,2A2B,则最多3次两两交换。不可能出现3A1B或1A3B的情况

点评

1A3B可以出现。  发表于 2016-9-24 16:54

评分

参与人数 1人气 +3 收起 理由
JuncoJet + 3 很给力

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2016-9-24 12:30:51 | 显示全部楼层
根据已有数据列出所有可能的结果这个很容易写吧,我很久以前写过……AI的话我用的是从所有可能结果里面随机选出一个出来

点评

要在10次内确定这个数字,否则就OVER了。  发表于 2016-9-24 13:24
回复 支持 反对

使用道具 举报

发表于 2016-9-24 13:13:58 | 显示全部楼层
這個是mastermind哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-24 23:46:37 | 显示全部楼层
  1. Private Sub Command3_Click()
  2. 'On Error GoTo break
  3.     Text2 = vbNullString
  4.     Dim lst(9)
  5.     For i = 0 To 9
  6.         lst(i) = 1
  7.     Next
  8.     txt = Split(Text1, vbCrLf)
  9.     For Each s In txt
  10.         If Len(s) < 8 Then
  11.             GoTo break
  12.         End If
  13.         x = Split(s, " ")
  14.         a = Val(x(1))
  15.         b = Val(x(2))
  16.         Dim n(3)
  17.         For i = 0 To 3
  18.             c = Mid(x(0), i + 1, 1)
  19.             n(i) = Val(c)
  20.         Next
  21.         Select Case a + b
  22.         Case 4
  23.             For i = 0 To 9
  24.                 lst(i) = 0
  25.             Next
  26.             For i = 0 To 3
  27.                 lst(n(i)) = 1
  28.             Next
  29.         Case 3
  30.             Select Case a
  31.             Case 3
  32.             Case 2
  33.             Case 1
  34.             Case 0
  35.             End Select
  36.         Case 2
  37.             Select Case a
  38.             Case 2
  39.             Case 1
  40.             Case 0
  41.             End Select
  42.         Case 1
  43.             Select Case a
  44.             Case 1
  45.             Case 0
  46.             End Select
  47.         Case 0
  48.             For i = 0 To 3
  49.                 lst(n(i)) = 0
  50.             Next
  51.         End Select
  52.     Next
  53. break:
  54.     out = vbNullString
  55.     x = 0
  56.     Dim lst2(9)
  57.     For i = 0 To 9
  58.         lst2(i) = -1
  59.         If lst(i) = 1 Then
  60.             lst2(x) = i
  61.             x = x + 1
  62.         End If
  63.     Next
  64.     z = x - 1
  65.     x = 0
  66.     For a = 0 To z
  67.         For b = 0 To z
  68.             For c = 0 To z
  69.                 For d = 0 To z
  70.                     If a <> b And a <> c And a <> d And _
  71.                        b <> c And b <> d And _
  72.                        c <> d Then
  73.                         out = out & lst2(a) & lst2(b) & lst2(c) & lst2(d) & vbCrLf
  74.                         x = x + 1
  75.                     End If
  76.                 Next
  77.             Next
  78.         Next
  79.     Next
  80.     Label1 = x & "个结果"
  81.     Text2 = out
  82. End Sub
复制代码
现在我能想到的解算方式是这样的,A+B个数分类,然后拆分AB个数
思路是5楼启发我的

点评

我很久以前试验过了,就算随机猜,大概在7次以内也能猜出来  发表于 2016-10-3 16:51
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-24 23:49:37 | 显示全部楼层
这个可以有直接算法的结果 A+B==4||A+B==0
其他的话 真心不好判断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-25 02:24:35 | 显示全部楼层
1234 2A0B
5678 0A2B

12XX
1X3X
1XX4
X23X
X2X4
XX34

56 65
57 75
58 85
67 76
68 86
78 87
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-5-24 17:45

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表