我想知道如何制作一个数值从1111开始并一直到8888的数组。我问这是因为我需要生成一个4位数的列表,每个数字的范围是1-8。我希望以循环形式拥有它。此外,我的功能修剪, methodicalEliminate , guessAndEliminate 和 guessThreeThenEliminate 在我的下一个程序中丢失了。以下是方向:
此作业侧重于在程序中使用数组,包括使用一个作为函数的参数。
问题描述 在Mastermind的游戏中,玩家仅被给予有限数量的猜测来尝试识别隐藏的组合(例如十二个猜测)。通常这是玩游戏的唯一限制因素。 但是有些玩家可能会互相竞争,看看谁可以在更少的尝试中猜出其他人的组合。在这种情况下,问题不仅在于提出一种策略,该策略可以在指定的限制内找到答案,而是找到一个可能需要最少数量猜测的策略。
这是计算机的用武之地 - 人们可以编写一个程序来尝试不同的猜测策略,并了解它们是如何运作的。由于计算机可以比一个人更快地进行分析和计算,它可以假装使用我们选择的任何策略代表我们玩Mastermind,并告诉我们这需要多长时间。
总体解决方案
当然,教导计算机以与人相同的方式推理是非常困难的。例如,如果我们猜到一个组合1111并得到一个黑色挂钩,我们会做一个心理记录,答案中只有一个1,然后继续对其中一个事实做出其他猜测。如果我们接下来猜测1222并得到一个白钉,我们就知道没有2,并且单个1不在第一个位置。但是,如何在一系列猜测之后跟踪这些信息会相当困难。
幸运的是,对于带有数组的计算机模拟,我们可以用不同的方式记录所有已知事实。我们只保留可能存在的所有可能答案的列表,然后从列表中删除不再是解决方案的数字。如果我们的第一个猜测告诉我们只有一个1位,我们将删除所有没有该功能的数字。当我们发现没有2时,我们会删除包含2的所有值。最终,剩下的唯一数字就是正确答案。
一些简单的策略
这是许多玩家使用的策略,类似于上面描述的内容。只是有条不紊地以直截了当的方式完成各种可能性。 1111的第一个猜测将回答解决方案中有多少1个;接下来的猜测将回答解决方案中有多少2个,并且还会说出任何1可能存在的位置,等等。 使用我们的列表方法,其中包含从1111,1112,1113,1114等开始的大量可能性,我们的下一个猜测将始终是列表中的第一个。
下一个策略是那些喜欢更多兴奋的人。猜测似乎或多或少是随机的,希望可以发现更多的信息。模拟这种方法非常简单 - 如果你有一个数字列表,只需随机选择一个。如果您有837种可供选择的数组,只需选择0到836范围内的随机下标。
第三种策略考虑了给出与给定猜测相似结果的答案在某种意义上彼此相似的可能性。因此,为了尝试获取更多信息,它仍然会随机选择一些数字而不考虑它们的评估方式,然后才开始考虑结果。 为了实现这个,让我们挑选任何三个可能的答案并猜测它们,暂时忽略他们赚了多少黑钉和白钉。只有在做出这些猜测之后,我们才会削减可能性列表,然后继续作为上面的第二个策略。
示例接口 这些是当前实现的示例结果:请输入要尝试的组合,或输入0表示随机值:0 猜测在2475
Guessing 1111...
Guessing 2222...
Guessing 2333...
Guessing 2444...
Guessing 2455...
Guessing 2456...
Guessing 2475...
有条理地消除所需的7次尝试。
Guessing 6452...
Guessing 2416...
Guessing 2485...
Guessing 2445...
Guessing 2435...
Guessing 2425...
Guessing 2475...
猜测并消除所需的7次尝试。
Guessing 7872...
Guessing 6472...
Guessing 1784...
Guessing 2475...
猜猜三然后消除所需的4次尝试。
玩另一个游戏? (是/否)y 请输入要尝试的组合,或输入0表示随机值:0 猜猜4474
Guessing 1111...
Guessing 2222...
Guessing 3333...
Guessing 4444...
Guessing 4445...
Guessing 4464...
Guessing 4474...
有条理地消除所需的7次尝试。
Guessing 3585...
Guessing 7162...
Guessing 4474...
猜测并消除所需的3次尝试。
Guessing 8587...
Guessing 1342...
Guessing 1555...
Guessing 7464...
Guessing 6764...
Guessing 4468...
Guessing 4474...
猜猜三然后消除所需的7次尝试。 注意:此程序允许每个数字最多为8而不是6.即使有4096个可能的答案,它仍然会很快找到它们。
计划规格 分配的程序必须实现以下所有功能。根据需要允许额外的 - 以下是必需的。未来的作业不会详细说明下面的功能 - 而是要求学生提前设计自己的功能描述来编写程序。主要: 简单地控制程序的整体行为。一个数字将是 选择作为目标组合,然后每个策略将尝试 找到它。 调用:generateAnswer,(比较所有三个必须有相同的答案) methodicalEliminate,guessAndEliminate,guessThreeThenEliminate
generateAnswer: 让键盘上的用户选择神秘组合, 或者给出让计算机生成随机组合的选项。 (对于竞争性游戏,了解什么是可能有趣的 组合将是最难猜的!) 参数:无! 返回:4位数组合,每个数字的范围为1到8
generateSearchSpace: 使用四位数的所有可能组合填充数组 值范围为1到8。 参数: 猜测(修改后的int数组)猜测列表 length(输出int)列表中的值数 前提: 必须将数组分配给不少于4096个元素。
修剪: 分析对特定猜测的响应,然后消除 来自可能性列表中的任何值都不再存在 可能的答案。在每种情况下,它都假设一个值 list是一个答案,并相应地评估猜测。如果 黑白钉的数量与指定的数量不同, 那么这不是正确的答案。 的参数: 猜测(修改后的int数组)猜测列表 length(modified int)列表中的值数 猜测(输入int)已经评估过的猜测 黑色(输入int)猜测有多少黑钉 白色(输入int)猜测有多少白钉 的前置条件: 黑白实际上确实包含了比较的结果 用实际答案猜测 的后置条件: 长度减少了(我们学到的东西) 可行的答案占据第一个长度'位置 在猜测数组中(所以列表更短) 电话:评估
methodicalEliminate : 从所有可能的候选答案列表开始 不断猜测列表中的第一个元素,和 相应地修剪答案,直到找到答案 参数: 回答(输入int)实际答案 (必须得到黑/白钉) 返回:查找答案所需的猜测次数 调用:generateSearchSpace,evaluate,trim
gusssAndEliminate : 从所有可能的候选答案列表开始 不断猜测列表中的随机元素,并且 相应地修剪答案,直到找到答案 参数: 回答(输入int)实际答案 返回:查找答案所需的猜测次数 调用:generateSearchSpace,evaluate,trim
gusssThreeThenEliminate : 从所有可能的候选答案列表开始 在修剪前首先猜测三个答案 可能性列表,然后缩小答案 一次随机猜测 参数: 回答(输入int)实际答案 返回:查找答案所需的猜测次数 调用:generateSearchSpace,evaluate,trim
注意:这些最后的函数使用正确的答案进行评估 每次猜测然后使用黑/白钉进行猜测 战略。这些策略中的NOne可能会偷看答案 决定下一步做什么!
另请注意:此程序中还应显示以下功能 从之前的任务来看,虽然他们不是自己 这部分成绩的一部分。
评价: 通过将其与答案进行比较来评估组合 黑色钉子表示正确性(正确位置正确的数字) 和白色钉子(错误位置的正确数字) 参数: 回答(输入int)正确的组合 猜测(输入int)当前的猜测 黑色(输出int)黑钉的数量 白色(输出int)白钉的数量 先决条件: 答案和猜测都是4位数字,没有零位数 后置条件: 黑色和白色都是> 0和它们的和是< = 4 调用:nthDigit,clearNthDigit
nthDigit: 确定了组合的第n位数 是否未指定从左到右或从右到左的数字计数 参数: 组合(输入int)组合来检查 position(输入int)要检查的数字 (返回)(输出int)实际数字的值 先决条件: 组合具有适当的位数,和 0&lt; position&lt; =位数 后置条件: 0 <=返回的数字&lt; = 9(单个数字)
clearNthDigit: 将组合的第n个数字归为零,因此它将不再匹配 必须以与上述nthDigit相同的方式计算数字。 参数: 组合(in / out int)组合修改 position(输入int)要设置为0的数字 前提: 与上面的nthDigit相同 后置条件: 相应的数字设置为零 调用:nthDigit(可选,取决于实现)
感谢您阅读这么长的问题,我希望您能帮我解决数组!
答案 0 :(得分:0)
仅仅因为您的猜测形式为1111到8888,这并不意味着它们是数字。
如果对它们进行算术计算是有意义的,它们就是数字。在猜测中定义算术计算是没有意义的:将猜测4571添加到猜测6214意味着什么?
如果您的猜测不是数字,请不要使用为数字保留的表示。但是,您可以使用四个整数的数组:
int guesses[4][4096];
int g = 0;
for (int i = 1; i <= 8; ++i)
for (int j = 1; j <= 8; ++j)
for (int k = 1; k <= 8; ++k)
for (int m = 1; m <= 8; ++m)
guesses[g++] = {i, j, k, m};
我非常确信将所有可能的猜测都放到数组guesses
中也不是一个好主意;代码主要演示了如何生成猜测。
通过其他函数,考虑应该对剩余的猜测执行哪些高级操作(例如“消除在thrid位置具有特定数字的所有猜测”等)。这应该可以让您了解更换guesses
数组的更好的数据结构。