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

时间:2018-01-03 18:14:42

标签: algorithm pseudocode

公牛和奶牛的比赛由两名球员进行。其中一个人想到了一个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

这是我使用此算法的地方。我不知道该怎么办。对我来说最明显的方法是手动分析所有可能数量的公牛和奶牛,但这只需要太长时间和太多的空间。如果有一种普遍的方式来满足所有可能的情况,你能给我一个暗示吗?

1 个答案:

答案 0 :(得分:1)

这个游戏让我想起了游戏Jotto,其中两个玩家选择了单词并反过来尝试猜对方的单词,只是被告知他们的猜测中有多少个字母在实际单词中(在Jotto中只有一个很大的区别,只能使用实际的单词。)

我的第一步是确定4头奶牛/公牛。这样我们就拥有了所有4位数字,然后我们就会担心订单是否正确。

为了识别4头母牛/公牛,我们首先猜测4个随机数。如果我们幸运并且牛+牛= = 0,那么我们可以消除所有这4个数字。 否则,我们会一次改变猜测一个数字。让我们说我们用a,b,c,d猜测,然后用a,b,c,e猜猜。

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

如果奶牛+公牛没有变化,那么d和e都是牛/牛,或者d和e都不是牛/牛。我们可以尝试另一个数字(f),直到我们看到变化,然后从那里得出结论。

如果牛+公牛上升1,那么我们可以得出结论:e是牛/牛,d既不是牛也不是公牛。

我们会继续这个,直到我们拥有所有4个数字。然后我们可以尝试不同的安排,一次一次改变,以确定我们是否越来越近。