【发布时间】:2019-03-22 17:17:27
【问题描述】:
我正在用 C 为学校项目编写一个程序,它比较两个数组的值并根据用户的输入给出具体的结果。基本上我的输出值为两个,correctPosition 和 correctValue。
correctValue 是在 valuesArray 中但不在 inputArray 中正确位置的值,例如;值“4”位于 valuesArray 的索引 1,但位于 inputArray 的索引 2。
correctPosition 是 valuesArray 和 inputArray 中相同索引处的值。例如;值“3”位于 valuesArray 和 inputArray
的索引 1如果两个数组之间的 x 值匹配,则它可以是正确的值或正确的位置。这是一个视觉表示:
valuesArray: 2 3 3
------------------
inputArray: 1 2 3
Answer: correctPosition = 1, correctValue = 1.
inputArray: 2 1 3
Answer: correctPosition = 2, correctValue = 0.
inputArray: 2 3 3
Answer: correctPosition = 3, correctValue = 0.
这是我为此编写的代码:
#include <stdio.h>
int main() {
int inputArray[3], valuesArray[3];
int correctNumber = 0, positionMatch = 0;
int x, y;
int visitedMatch[3];
valuesArray[0] = 2;
valuesArray[1] = 3;
valuesArray[2] = 3;
inputArray[0] = 1;
inputArray[1] = 2;
inputArray[2] = 3;
for( x = 0; x < 3; x++) {
visitedMatch[x] = 0;
}
for(x = 0; x < 3; x++) {
for(y = 0; y < 3; y++) {
if (inputArray[x] == valuesArray[y] && visitedMatch[y] == 0) {
if (x == y) { positionMatch++; } else { correctNumber++; }
visitedMatch[y] = 1;
break;
}
}
}
printf("correctPosition = %d, ", positionMatch);
printf("correctValues = %d\n", correctNumber);
return 0;
}
问题在于,对于输入 1 2 3,它首先取 1 并检查 valuesArray 并找不到任何东西,因此结果保持为 0。然后在 x = 1 的第二次迭代中,它取 2 并检查它是否在数组但不在正确的索引处,因此正确值计数器变为 1。现在在 x = 2 的最终迭代中,它需要 3 并通过循环并在索引 2 处找到第一个值“3”,因为它之前从未被访问过,所以最终结果变为正确位置 = 0,正确值 = 2。如果我将输入写为 2 3 3,那么它工作正常,输出正确位置 = 3,正确值 = 0。我该如何解决这个问题,我错过了什么在这里?
任何帮助将不胜感激。
【问题讨论】:
-
你能试着澄清一下这里的实际任务吗?也许只有我一个人,但我很难弄清楚
-
我建议您以不同的方式处理问题。首先扫描两个数组以找到精确匹配(即
positionMatch)。然后使用基于直方图的方法计算valueMatch的初步版本:计算valuesArray中每个符号的数量以及inputArray中每个符号的数量,并计算所有符号的总和这两个值的最小值。然后,从初步的valueMatch中减去positionMatch,以消除否则会出现的重复计算。 -
我建议先检查它是否是正确的位置,然后再寻找其他不太具体的情况。使用“短路”逻辑。
-
@TormundGiantsbane 这是一款名为 Master Mind 的棋盘游戏,我们需要使用树莓派来制作它。因此生成了一个秘密值数组(valuesArray),用户必须使用物理按钮输入猜测正确的序列。
-
那么我现在尝试的方式是不是不可能?