对于 猜数字 游戏,请问最多需要几次才能猜中?如何证明?

codingboy 2001-12-08 09:40:35
文曲星猜数字游戏是这样的:
4个数字.你猜一次之后,它会给出提示:xAyB.A表示位置和值都对,x表示这样的数字的个数;B表示你猜的数字答案中有但是位置不对,y表示这样的数字的个数.
例如,假设答案是1234,当我猜1243时,提示为:2A2B;猜1678,提示为:1A0B;猜4321,提示为:0A4B;猜5678,提示为:0A0B.
请问最多需要几次才能猜中?如何证明?算法怎样设计?
...全文
2998 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sippey 2002-01-18
  • 打赏
  • 举报
回复
楼上的,你有电脑算得快;
附,我的原代码
DECLARE SUB cai ()
DECLARE SUB check (ia!, ib!)
DECLARE SUB fill ()
'---------------------LOADING-------------------
CLS
DIM SHARED caiz(1 TO 4) AS INTEGER
DIM SHARED kngs AS INTEGER: kngs = 5040
DIM SHARED knsz(5040, 4) AS INTEGER
DIM c AS INTEGER
CALL fill
'----------------------main---------------------
lcai: CALL cai
INPUT "How many A"; ia
INPUT "How many B"; ib
CALL check(ia, ib)
c = kngs
IF c > 1 THEN PRINT "I Can't Guess~~Please input more infos.": GOTO lcai
IF c = 1 THEN PRINT "I KNOW!! The number is"; knsz(1, 1); knsz(1, 2); knsz(1, 3); knsz(1, 4)
IF c < 1 GOTO ted
ted: END

SUB cai
DIM s AS INTEGER
RANDOMIZE TIMER
rc: s = INT(RND(1) * kngs)
IF s = 0 THEN GOTO rc
PRINT "Is it"; knsz(s, 1); knsz(s, 2); knsz(s, 3); knsz(s, 4); "?"; " "; INT(1 / kngs * 100); "%"
caiz(1) = knsz(s, 1): caiz(2) = knsz(s, 2): caiz(3) = knsz(s, 3): caiz(4) = knsz(s, 4)
END SUB

SUB check (ia, ib)
DIM v, pr2, x, y, i, a, b AS INTEGER
v = kngs
pr2 = 1
'------------------------------------------------------------------
FOR i = 1 TO v
FOR x = 1 TO 4
FOR y = 1 TO 4
IF caiz(x) <> knsz(i, y) THEN GOTO ny
IF x = y THEN a = a + 1 ELSE b = b + 1
ny: NEXT y
nx: NEXT x
'--------------
IF ia = a AND ib = b THEN
knsz(pr2, 1) = knsz(i, 1): knsz(pr2, 2) = knsz(i, 2): knsz(pr2, 3) = knsz(i, 3): knsz(pr2, 4) = knsz(i, 4): pr2 = pr2 + 1
ELSE
kngs = kngs - 1
END IF
'--------------
a = 0: b = 0
IF kngs < 1 THEN PRINT "Your input are wrong!": GOTO ed
NEXT i
'-----------------------------------------------------------------
ed: END SUB

SUB fill
DIM pr, q, b, s, g AS INTEGER
pr = 1
FOR g = 0 TO 9
FOR s = 0 TO 9
IF s = g THEN GOTO ns
FOR b = 0 TO 9
IF b = s OR b = g THEN GOTO nb
FOR q = 0 TO 9
IF q = b OR q = s OR q = g THEN GOTO nq
knsz(pr, 1) = q: knsz(pr, 2) = b: knsz(pr, 3) = s: knsz(pr, 4) = g
pr = pr + 1
nq: NEXT q
nb: NEXT b
ns: NEXT s
NEXT g
END SUB

较乱,见谅
qb4.5编译通过
晨星 2002-01-18
  • 打赏
  • 举报
回复
谁能给出证明或算法来吗?在下也想学习。
为什么有时候我八次还猜不出来?从来都没想到我是那么傻。
bbb20bb 2002-01-18
  • 打赏
  • 举报
回复
如何编写算法实现电脑猜(只要6次)
intfree 2001-12-14
  • 打赏
  • 举报
回复
网上有较好的 信息论 的中文的资料吗?
st314 2001-12-12
  • 打赏
  • 举报
回复
我也写过一个,用的排除法,一般6次可以猜出来。
神富 2001-12-10
  • 打赏
  • 举报
回复
我可以证明对于 4位数最多是7次(呵呵,除非瞎猜乱猜,那就不定几次了)。

我上大一时初学delphi编写了这个游戏,但用的是最笨的方法(穷举法)
经反得游戏测试,如果第7次我猜不对计算机的数,那么他一定会猜出我的数。

计算机猜数,实际上,每次随机出一个4位数,你每次给的答案?A?B保存在一个数组里
只要这个随机数符合?A?B数组的判断,就把这个数发给用户,循环......

Zig 2001-12-10
  • 打赏
  • 举报
回复
可以证明,这个是信息论的标准问题,去网上用mastermind查查,有一堆的说明。
codingboy 2001-12-10
  • 打赏
  • 举报
回复
海星,zig等各位大虾能不能详细分析一下?
wjohenw 2001-12-10
  • 打赏
  • 举报
回复
最多7次
我已证明!
starfish 2001-12-09
  • 打赏
  • 举报
回复
4位数的话最多7次即可猜出来
kimcom 2001-12-09
  • 打赏
  • 举报
回复
好像和Nokia手机上的游戏相似 。。
andrew80 2001-12-09
  • 打赏
  • 举报
回复
是最少吧。

最多可就没数了,碰到个没脑子的,4!次也有可能。

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧