我已经束手无策了。我已经做了我自己的单元测试,并且得到了很好的结果。所以,我不知道为什么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
任何意见都将不胜感激。请允许我用苏格拉底式的方式回答我的问题,而不是破坏答案:)
1条答案
按热度按时间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,你就创建了一个链,所以你不应该