有多種方式來處理遊戲解決的普遍問題,並模仿人類的策略並不總是最好的方法。這就是說,這裏是你如何能夠解決你的問題:
1路,蠻力forcy
基本上,我們想嘗試的細胞組合的所有可能性,並挑選具有正確的總和的人。
cell_1 = [1,3,4,9]
cell_2 = [2,4,5]
cell_3 = [3,4,9]
all_valid_combinations = cell_1.product(cell_2,cell_3).select {|combo| combo.sum == 12}
# => [[1, 2, 9], [3, 5, 4], [4, 4, 4], [4, 5, 3]]
#.sum isn't a built-in function, it's just used here for convenience
削下來單個單元格,你可以這樣做:
cell_1 = all_valid_combinations.map {|combo| combo[0]}.uniq
# => [1, 3, 4]
cell_2 = all_valid_combinations.map {|combo| combo[1]}.uniq
# => [2, 5, 4]
. . .
,如果你沒有一個巨大的大組單元,這種方式更容易代碼。但它可能會有點低效。對於小問題,這是我使用的方式。
第二個方式,回溯搜索
另一個衆所周知的技術從其他方法利用的問題。基本上,對於每個細胞,問「這個細胞可以是這個數字,給其他細胞?」
所以,開始與小區1中,可以在數是1?檢查,我們看到如果單元格2和3可以和11。(12-1) *可以單元格2的值爲2?檢查,能小區3總和至9(11-1)
等。在非常大的情況下,你可以有許多有效的組合,這會稍微快一點,因爲你可以在第一次找到一個單元格的有效數字時返回'真'。但有些人發現遞歸算法有點難度,所以你的里程可能會有所不同。
這可以通過回溯來實現。 – 2012-04-11 16:25:05
這聽起來像你被困在概念階段。你有沒有考慮聘請某人來幫助你? – pguardiario 2012-04-11 17:01:45
@pguardiario你是否願意成爲「某人」? – 2012-04-12 00:05:15