Функция Lock_pair для CS50 Pset 3 Tideman - проверка циклов на графике - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю над проблемой, которая называется 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;
        }
    }
}
...