Я работаю над проблемой, которая называется Tideman. Цель состоит в том, чтобы создать программу голосования по алгоритму Tideman. Вот объяснение проблемы: https://cs50.harvard.edu/x/2020/psets/3/tideman/ Check50 (предоставленный тест из курса CS50, который я беру) всегда возвращает "lock_pairs пропускает среднюю пару, если создает цикл. Lock_pairs не правильно блокирует все нециклические пары "Цель функции lock_pairs - go просмотреть график победителей и проигравших и убедиться, что цикл не создается (ссылка на проблему объясняет это лучше). Я не совсем понимаю, что означает пропуск средней пары, и программа работает в ситуациях, когда при тестировании создается цикл. Кроме того, он проходит проверку «lock_pairs пропускает последнюю пару, если создает цикл». Я реализовал lock_pairs, проверив, есть ли у всех кандидатов ребро (пропуская текущий проигравший пары), и заблокировав пару, только если не у всех кандидатов есть ребра (поэтому цикл не создается). Как мне это исправить?
void lock_pairs(void)
{
//checks if a candidate has an edge on it, originally sets all to 0
bool candidatesEdge[candidate_count];
for(int i = 0; i < candidate_count; i ++)
{
candidatesEdge[i] = false;
}
for (int i = 0; i < pair_count; i ++)
{
//variable to see if all others have edges
bool full = true;
int j = 0;
//checks through all other candidates for an edge
while (j < candidate_count && full == true)
{
//if a candidate besides the current being checked doesn't have an edge, full is false
if (j != pairs[i].loser && candidatesEdge[j] == false)
{
full = false;
}
j++;
}
//if not all candidates have edges, gives the loser of the pair an edge
if (full == false)
{
candidatesEdge[pairs[i].loser] = true;
locked[pairs[i].winner][pairs[i].loser] = true;
}
}
}