作者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