首页 > 解决方案 > CS50 的 Tideman 问题集中 lock_pairs 函数的缺陷

问题描述

有人可以指出我的逻辑有什么缺陷吗?将不胜感激。

基本上,我试图用嵌套循环做的是检查任何一对的输家是否是前一对的赢家(具有更高的胜利强度)。如果是,然后我进入内部循环,检查这对的赢家是否在之前的任何一对中都是输家,从而创建一个循环。我对什么构成循环的理解是否正确?我怎样才能在不实施递归的情况下纠正这个问题?我不知道该怎么做。

void lock_pairs(void)
{
    
  bool cycleCheck = false;
  
  for (int u = 0; u < pair_count; u++)
  {
  
   for (int m = 0; m < u; m++)
   {
    if (pairs[u].loser == pairs[m].winner)
    {
        for (int k = m; k < u; k++)
        {
        if (pairs[u].winner == pairs[k].loser)
        {
            locked[pairs[u].winner][pairs[u].loser] = false;
            cycleCheck = true;
        }
        }
    }
   }
  
  
  if (cycleCheck == false)
  {
      locked[pairs[u].winner][pairs[u].loser] = true;
  }
  
  cycleCheck = false;
  
  }
      
}

标签: ccs50

解决方案


给定一对 A 击败 B,要检查循环,您应该遍历所有对以寻找 B 作为赢家。然后,对于每个输给 B 的候选人,您应该遍历所有对,寻找该候选人作为获胜者。然后,对于每一个输给这个候选人的候选人……你明白了。如果在任何时候出现A,它就是一个循环。


推荐阅读