我已经为这个 pset 苦苦挣扎了将近一个星期,我觉得真的很接近解决它了
只有一个错误,我希望你能告诉我为什么它仍然存在:
:( lock_pairs 跳过最后一对,如果它创建循环
lock_pairs 没有正确锁定所有非循环对
这是我的代码:
bool paths(int winr,int losr)
{
if(locked[losr][winr])
{
return true;
}
else
{
for(int i = 0 ; i < pair_count ; i++)
{
if((losr==pairs[i].winner)&&(locked[pairs[i].winner][pairs[i].loser]))
return paths(winr,pairs[i].loser);
}
}
return false;
}
void lock_pairs(void)
{
// TODO
bool potential;
for(int i = 0 ; i < pair_count ; i++)
{
for(int j = 0 ; j < pair_count ; j++)
{
if(!(pairs[i].loser==pairs[j].winner&&locked[pairs[j].winner][pairs[j].loser]))
potential=false;
else
{
potential=true;
break;
}
}
if(potential==false)
locked[pairs[i].winner][pairs[i].loser]=true;
else if(potential)
{
for(int k = 0 ; k < pair_count ; k++)
{
if(pairs[i].loser==pairs[k].winner&&locked[pairs[k].winner][pairs[k].loser])
{
if(paths(pairs[i].winner,pairs[i].loser))
break;
else if(paths(pairs[i].winner,pairs[i].loser)==false)
locked[pairs[i].winner][pairs[i].loser]=true;
}
}
}
}
}
注意我只在存在潜在的间接循环时才调用 paths()。