CS50 - PSET 3 - Tideman - lock_pairs()在我测试时工作,但未通过单元测试

kqlmhetl  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(126)

我已经束手无策了。我已经做了我自己的单元测试,并且得到了很好的结果。所以,我不知道为什么check50返回错误。
Tideman问题描述:https://cs50.harvard.edu/x/2022/psets/3/tideman/
CS50 IDE:https://ide.cs50.io
lock_pairs方法:第一个月
以下是错误

:( lock_pairs locks all pairs when no cycles
    lock_pairs did not lock all pairs
:) lock_pairs skips final pair if it creates cycle
:( lock_pairs skips middle pair if it creates a cycle
    lock_pairs did not correctly lock all non-cyclical pairs

因为CS50关于剽窃的“荣誉准则”,我不太愿意去查其他类似的问题。所以,请原谅我这个经常重复的问题。
方法如下:

void lock_pairs(void)
{
    // count forward
    for (int i = 0; i < pair_count; i++)
    {
        int winner = pairs[i].winner;
        int loser = pairs[i].loser;

        if (check_cycle_winner(winner, loser, i) && check_cycle_loser(loser, winner, i))
        {
            locked[winner][loser] = false;
        }
        else
        {
            locked[winner][loser] = true;
        }
    }
    return;
}

以下是“helper”函数:

bool check_cycle_winner(int winner, int loser, int index)
{
    if (winner == loser) return true;

    if (index == 0) return false;

    return check_cycle_winner(winner, pairs[index - 1].loser, index -1);
}

bool check_cycle_loser(int loser, int winner, int index)
{
    if (loser == winner) return true;

    if (index == 0) return false;

    return check_cycle_loser(loser, pairs[index - 1].winner, index -1);
}

完整程序(在CS50 IDE中测试):https://replit.com/@A1cmae0n/PSET3-Tideman#main.c
测试复制中的lock_pairs:https://replit.com/@A1cmae0n/CS50-PSET3-Tideman-lockpairs#main.c
任何意见都将不胜感激。请允许我用苏格拉底式的方式回答我的问题,而不是破坏答案:)

zf9nrax1

zf9nrax11#

您的代码是错误的,因为您要查找的是完整周期,而不是链,您应该查找后者。
If it helps here I explain the logic of lock pairs
a)您想要锁定对4,但是...
B)pairs[4]。失败者返回0,表示失败者的ID为0
c)ID 0在锁定[0][2]处获胜
d)id 2在锁定时获胜[2][4]
e)因此,如果你把locked[5][0]锁为true,你就创建了一个链,所以你不应该

相关问题