CS50 潮人; lock_pairs 如果创建循环则跳过最后一对

CS50 TIDEMAN; lock_pairs skips final pair if it creates cycle

我正在处理 CS50x (https://cs50.harvard.edu/x/2020/psets/3/tideman/) 的潮汐问题。当我 运行 check50 所有测试都通过时,除了一个:

:( lock_pairs 如果创建循环则跳过最后一对 lock_pairs 没有正确锁定所有非循环对

我一直在寻找错误,但无法弄清楚是什么问题。我需要帮助。

下面是代码:

// checking if a pair creates a circle
bool iscycle(int winner, int loser)
{
    if (winner == loser)
    {
        return true;
    }

    int k = 0;
    while (k < 3)
    {
        //checking if the current loser is a winner in any locked pair
        if (pairs[k].winner == loser && locked[pairs[k].winner][pairs[k].loser] == true)
        {
            //if the loser of the current pair is thesame as the winner return true
            if (pairs[k].loser == winner)
            {
                return true;
            }
            else
            {
                return iscycle(winner, pairs[k].loser);
            }
         }
         k++;
    }
    return false;
}

// Lock pairs into the candidate graph in order, without creating cycles
void lock_pairs(void)
{
    // locking the pairs that do not cause a cycle
    for (int i = 0; i < pair_count; i++)
    {
        // if "iscyle" returns false: if does'nt create a cycle else it does
        if (iscycle(pairs[i].winner, pairs[i].loser) == false)
        {
            locked[pairs[i].winner][pairs[i].loser] = true;
        }
        else
        {
            locked[pairs[i].winner][pairs[i].loser] = false;
        }
    }
}

有两个错误。

  1. 您忘记对 Alice Bob Charlie 情况以外的任意数量的对进行概括:

        while (k < 3)
    

    必须

        while (k < pair_count)
    
  2. 如果iscyclereturns false的递归调用,函数可能不会return立即,但必须检查可能的其他对来自局部 loser:

    的边
                    return iscycle(winner, pairs[k].loser);
    

    必须

                    if (iscycle(winner, pairs[k].loser)) return true;