公牛和奶牛 - 破解密码 - 算法

Bulls and cows - breaking the cipher - algorithm

牛和牛的游戏由两人进行。其中一个想到一个 4 位数的密码(从 0 到 9 的数字),然后另一个玩家提出一个建议。第一位玩家回答正确放置的数字(公牛)和正确但位置错误的数字(奶牛)的数量。
我想编写一个程序来猜测密码,然后读取公牛和奶牛的数量并再次猜测。我希望这个过程能够相对快速地结束。

1. Create a 4-dimensional boolean array 10 x 10 x 10 x 10
2. Set all elements of this array to true, bulls = 0, cows = 0
3. While bulls != 4
   3.1. Find the first element of the array which is set to true
   3.2. Make a guess with this number
   3.3. Read the number of bulls and cows
   3.4. If bulls = 0 and cows = 0
        set all codes containing any of the digits from the last code to false

这就是我使用这个算法的地方。我不确定如何进行。对我来说最明显的方法是手动分析所有可能的公牛和奶牛数量,但这将花费太长时间和太多 space。如果有一种通用的方法可以满足所有可能的情况,您能给我一个提示吗?

这个游戏让我想起了游戏 Jotto,两个玩家选择单词并依次尝试猜测对方的单词,只是被告知他们猜测的字母在实际单词中有多少个(一个大不同之处在于 Jotto 中只能使用实际单词)。

我的第一步是确定 4 cows/bulls。这样我们就有了所有的4位数字,那么我们就可以担心顺序是否正确了。

要识别4个cows/bulls,我们先猜4个随机数。如果幸运的话,奶牛 + 公牛 = 0,那么我们可以消除所有这 4 个数字。 否则,我们会一次改变我们猜测的一个数字。假设我们用 a, b, c, d 猜测,然后我们用 a, b, c, e 猜测。

如果 cows + bulls 在下一次猜测后下降 1,我们可以得出结论,我们删除的数字 (d) 是 cow 或 bull,而新数字 (e) 不是 cow 或 bull。

如果 cows + bulls 不变,则要么 d 和 e 都是 cows/bulls,要么 d 和 e 都不是 cows/bulls。我们可以尝试另一个数字 (f),直到看到变化,然后从那里得出结论。

如果 cows + bulls 上升 1 那么我们可以得出结论 e 是 a cow/bull 并且 d 既不是牛也不是牛。

我们将继续这样做,直到我们拥有所有 4 个号码。然后我们可以尝试不同的安排,再次一次改变,以确定我们是越来越近还是越来越远。