我有一项任务,预计我将在2D数组中填充其他对手的排名。如果您熟悉潮人投票方法,那么这对您来说很有意义:到目前为止,这就是我所拥有的。它部分起作用。不幸的是,当票数变化时,结果也会变化。
for (int i = 0; i < x; i++)
{
for (int j = 0; j < x ; j++)
{
rN = i + k;
if (i != j)
{
if (r[i] > rN);
x = r[i];
y = r[j];
p = 1;
pt[x][y] = pt[x][y] + p;
}
}
}
r[i]
代表种族中的人。假设数组只有3个人。
如果:r[i]
代表投票卡上的候选人位置。在这种情况下,有3个职位。我不允许将r的值更改为字符串,也不能添加结构。我必须用数字代表候选人。可以说,安德鲁(Andrew)被选为第一,布莱恩(Brian)被选为第二,查理(Charlie)被选为第三。然后在r中:Andrew = 0
Brian = 1
Charlie = 2
因此,安德鲁(Andrew)胜过布莱恩(Brean)1次,比查理(Charlie)1次,而布莱恩(Brean)胜过查理(Charlie)1次。
所以我需要像这样填充我的2D数组pt[ ][ ]
:
A B C
A 0 1 1
B 1 0 0
当它们优先于列时,它们相交,则得到1。如果安德鲁排在第一,布莱恩排在第二,查理排在第三,那就很好。但是,当这些订单改变时,我在候选人未赢得一对的列中得到1。
我希望有人能理解。这是一项复杂的工作,因为这是我第一次浏览这样的2d数组。
经过数小时的辛劳,我发现了这一点。因此,对于试图绕过“记录偏好设置”部分的学生来说,这似乎是实现此目标的唯一方法:
for (int i = 0, p = 0, t = 0; i < xt; i++)
{
if (i == xt - t)
{
break;
}
for (int j = 0 + t, r, l = 1; j < xt ; j++)
{
x = r[i];
y = r[j];
if (i != j)
{
p = 1;
r = pt[x][y];
pt[x][y] = r + p;
}
}
t++;
}
事实证明,当我们在第一个if
循环之后实现一个小的for
语句时,我们可以更改该for
循环的最大迭代次数:
for (int i = 0, p = 0, t = 0; i < x; i++)
{
if (i == x - t)
{
break;
}
这将每次迭代缩短for
循环的时间1次。
我们还需要缩短j j
循环的每次迭代的for
起点。您可以在此处看到,以j = 0 + t
表示。您必须计算出该选票上哪位候选人先获胜,然后哪位候选人获胜。然后谁赢了第二,赢了第三,依此类推。在下面的每个数字是候选人的等级:
0 beats 1
0 beats 2
0 beats 3
0 beats 4
1 beats 2
1 beats 3
2 beats 4
2 beats 3
2 beats 4
3 beats 4
第一列(i
的迭代用于更改x
在pt[x][y]
中的位置的列中的数字,每i
的迭代减少1。
[第二列中的数字,由y
中的pt[x][y]
表示,从上一迭代开始+ 1。
这非常令人困惑,这可能是哈佛为什么将其用作作业的原因。