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;
}
}
}
有两个错误。
您忘记对 Alice Bob Charlie
情况以外的任意数量的对进行概括:
while (k < 3)
必须
while (k < pair_count)
如果iscycle
returns false
的递归调用,函数可能不会return立即,但必须检查可能的其他对来自局部 loser
:
的边
return iscycle(winner, pairs[k].loser);
必须
if (iscycle(winner, pairs[k].loser)) return true;
我正在处理 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;
}
}
}
有两个错误。
您忘记对
Alice Bob Charlie
情况以外的任意数量的对进行概括:while (k < 3)
必须
while (k < pair_count)
如果
的边iscycle
returnsfalse
的递归调用,函数可能不会return立即,但必须检查可能的其他对来自局部loser
:return iscycle(winner, pairs[k].loser);
必须
if (iscycle(winner, pairs[k].loser)) return true;