作者yauhh (哟)
看板C_Sharp
标题Re: [问题] 电脑猜数字
时间Tue Dec 15 19:29:30 2009
※ 引述《meteor009 (椰子)》之铭言:
: 已爬文
: 玩法:电脑猜数字(4位数,数字不重复)
: 使用者给几A几B
: 我的做法:
: 一开始把电脑可能的答案(0123~9876,去除中间重覆的数字)存到一个阵列里
: ↑使用list<String>
: 第一次随便Random一个出来,然後使用者给?A?B
: 接着就出现问题了...Orz
: 我不知道该怎麽让电脑根据使用者给的?A?B去可能的答案阵列中剔除不符合的数字
: 然後再从剩余的数字阵列中Random出一个数字作为答案
: 麻烦板上的高手大大救救我 T___T
: 先感谢大家了~
如果要先产生10*9*8*7个判断资料,却在其中只用到几笔,很浪费啊.
电脑猜数字,过程为:
guess.1: 1234 -> match.1: 1A1B
guess.2: 5678 -> match.2: 0A1B
......
guess.k: ooxx -> match.k: xxoo
我们用guess.i代表guess.1到guess.k的任何一项,相对它,有一个match.i.
电脑该抛出哪个guess.(k+1)呢?
电脑抛出guess.(k+1),是希望guess.(k+1)得到4A0B.
如果guess.(k+1)是4A0B,则guess.i与guess.(k+1)比较,必定得到match.i!
所以,
规则一: 电脑乱数取四个数字,检查这一组与每个guess.i比较,都会得到match.i.
如果通过检查,这四个数字就可以抛出去做guess.(k+1).
是简单的方法.
另外有一条规则:
规则二: 如果match.i是0A0B,则将guess.i四个数字排除在可参与乱数的数字之外.
这样做会比较容易. 祝好运.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.160.208.90
※ 编辑: yauhh 来自: 218.160.208.90 (12/15 19:37)
1F:推 liaommx:原po的想法比较像是人工智慧的想法. 12/16 02:03
2F:→ liaommx:简单的猜数字解程式的想法,则是消去法 12/16 02:03
3F:→ liaommx:可是消去法会有一个小问题..就算找出0a0b的四个数字 12/16 02:03
4F:→ liaommx:剩下的6个数字,只能凑出2个0a0b..所以必须用case方式去解 12/16 02:04
5F:→ liaommx:先找出4个0a0b数字,随便抽两个出来,和剩下数字做排列. 12/16 02:04
6F:→ liaommx:找出另2个0a0b数字...那麽最後的4个数字就是0a4b... 12/16 02:05
7F:→ liaommx:去做排列就是4a0b了 12/16 02:05
8F:→ yauhh:那些额外的规则当然要自己想罗,不是什麽方法都包山包海 12/16 02:48
9F:→ yauhh:可能是计分法,2A1B给一种分数,2A2B给一种分数,然後比哪个数 12/16 02:50
10F:→ yauhh:优先. 挑数字的策略复杂,程式就不好写;程式好写,程式就笨. 12/16 02:51
11F:→ yauhh:还有,这可不是人工智慧,而是这个问题的基本推理. 12/16 03:43
12F:推 liaommx:给分数..我想想... 12/16 09:44
13F:→ yauhh:我说策略复杂是指同一程式前後综合多种策略,猜数字可能要练 12/16 09:45
14F:推 liaommx:这的确不能说是人工智慧,我的想法有点错了. 12/16 09:46
15F:→ yauhh:习这种复杂性. 第一组数字抛乱数,第二组开始与前一组记录比 12/16 09:46
16F:→ liaommx:因为AI可以学习,但是这程式只到猜出为止.. 12/16 09:46
17F:→ yauhh:较,并且如果遇到0A0B要把乱数范围缩小,而对付其他的?A?B就要 12/16 09:47
18F:→ yauhh:对可参与的每个数字加分数,选分数高的. 选出分数高的数字 12/16 09:48
19F:→ yauhh:还要试一下调换排列顺序. 好几种事情可以在二步之间考虑好.. 12/16 09:49
20F:→ yauhh: 对啊,这不是人工智慧,只不过是把人类智慧写成程式而已. 12/16 09:50
21F:推 Elly:这个流程都可以算是写规格书了~不算在写程式了 12/16 23:37