CS50 Tideman - 添加配对

CS50 Tideman - Add Pair

我目前正在解决 CS50 的 Tideman 问题,我正在使用 add_pairs 功能。到目前为止,这是我的代码:

// Record pairs of candidates where one is preferred over the other
void add_pairs(void)

{
    for (int i = 0; i < candidate_count; i++) {
        for (int j = 0; j < candidate_count; j++) {
            if (preferences[i][j] > preferences[j][i]) {
                pairs[i].winner = i;
                pairs[i].loser = j;
                pair_count += 1;
            }

        }
    }
    return;
}

我的代码几乎通过了,但未通过 add_pairs 测试之一:

:( add_pairs fills pairs array with winning pairs
    add_pairs function did not produce correct pairs

通过谷歌搜索,我看到一个单独的 else if 块必须检查是否 preferences[i][j] < preferences[j][i]。然后我们根据这个额外的 else/if 检查分配 winner/loser 组合索引。

但我就是想不通为什么我们需要这个额外的 if 语句?上面的嵌套循环(我的代码)是否根据其反向索引对应物检查 table 内的所有单元格?这意味着我们不需要检查其他 else/if 条件,因为我们首先检查了所有可能性?例如,如果我们想检查索引 (0,1) 处的值与其相反的值 (1,0) - 上面的嵌套循环保证通过 if 语句?[=13 相互检查两个索引=]

考虑有 4 名候选人 a、b、c、d(索引分别为 0 到 3)的选举。根据这个程序:

  • a 打败 b => pairs[0].winner = a, pairs[0].loser = b
  • a 打败 c => pairs[0].winner = a, pairs[0].winner = c
  • a 打败 d => pairs[0].winner = a, pairs[0].winner = d

你知道这是怎么回事吗? pairs数组索引独立于候选数组索引。

pairs 数组的索引与候选人的索引无关,因此您应该使用另一个变量作为索引,而不是代码中的 i 或 j。