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

问题描述 投票:2回答:1

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

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

algorithm pseudocode
1个回答
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个数字。然后我们可以尝试不同的安排,一次一次改变,以确定我们是否越来越近。

© www.soinside.com 2019 - 2024. All rights reserved.