CS50&x27;s pset3潮人。。。我的锁功能没有';好像不行

CS50&x27;s pset3潮人。。。我的锁功能没有';好像不行,c,cs50,C,Cs50,我一直在试图解决一个关于lock_pairs函数的问题。我使用递归来验证我们是否有一条沿着循环的路径(基本上,沿着失败者的路径看它是否战胜了另一个候选人,并检查我们是否回到原点,有效地形成了一个循环) 但我有一个问题,因为在使用check50验证我的解决方案时,它返回了一个错误,我太迷茫了,甚至想不出哪里出了问题,我觉得我已经检查了所有内容,但它仍然不起作用 这是check50中的错误: :( lock_pairs skips final pair if it creates cycle loc

我一直在试图解决一个关于lock_pairs函数的问题。我使用递归来验证我们是否有一条沿着循环的路径(基本上,沿着失败者的路径看它是否战胜了另一个候选人,并检查我们是否回到原点,有效地形成了一个循环)

但我有一个问题,因为在使用check50验证我的解决方案时,它返回了一个错误,我太迷茫了,甚至想不出哪里出了问题,我觉得我已经检查了所有内容,但它仍然不起作用

这是check50中的错误:

:( lock_pairs skips final pair if it creates cycle
lock_pairs did not correctly lock all non-cyclical pairs
代码如下:

    // To be used in lock_pairs to avoid cycles, true means cycles, false means we good
bool check_cycles(int loser_ind, int winner_ind)
{
    // Base case, if the loser path returns to the winner, we have a circle
    if (loser_ind == winner_ind)
    {
        return true;
    }

    for (int i = 0; i < candidate_count; i++)
    {
        if (locked[loser_ind][i]) // If the loser has an edge over another candidate, i.e, if the loser candidate won against another candidate
        {
            return check_cycles(i, winner_ind); // We'll check if that other candidate that lost has a winning path to another candidate
        }
    }

    return false;

}

// Lock pairs into the candidate graph in order, without creating cycles
void lock_pairs(void)
{
    // Let's loop on all pairs
    for (int i = 0; i < pair_count; i++)
    {
        // If we didn't created a cycle, we'll register the lock
        if (!check_cycles(pairs[i].loser, pairs[i].winner))
        {
            locked[pairs[i].winner][pairs[i].loser] = true; // It means the i-th pair winner candidate won over i-th pair losing candidate
        }
    }

    return;
}
//在锁对中使用以避免循环,true表示循环,false表示我们好
布尔检查循环(整数输家标识,整数赢家标识)
{
//基本情况下,如果输家路径返回到赢家,我们有一个圆
如果(失败者=胜利者)
{
返回true;
}
对于(int i=0;i
可能会改变

return check_cycles(i, winner_ind);


将修正它

你可以考虑锁定失败者指数,因此胜利者在末尾不会有锁。您的循环检查只需要在最后一次锁迭代时调用。(在此之前,不存在循环的可能性)。放置锁时,如果使用
pair\u count
元素初始化
int
数组,开始时所有元素均为零,然后在每个边锁定的情况下将值设置为
array[pairs[i]=1
,您可以简单地检查是否只有一个索引保持为零,并且如果该索引对应于要放置的下一个锁的索引,则不要放置它。(至少PSET3中的所有测试都是这样)谢谢!!事实上,这帮助我更好地理解了它的作用。如果您仍然被卡住,请告诉我,我很乐意进一步提供帮助。“return check_cycles(I,winner_ind);”结束for循环并返回到check_cycles的上一次迭代,而不检查所有“I,winner_ind”对,只检查第一对,而“If(check_cycles(I,winner_ind)){return true;}”只有在找到一个循环时才停止循环和函数的迭代。非常感谢!我现在明白了
if (check_cycles(i, winner_ind)){
    return true;
}