Это voter -= 1;
плохо. Программа все еще находится в i
l oop, поэтому ожидайте неожиданное, потому что программа может попытаться посмотреть на preferences[-1][1]
.
Вот выборы, на которых функция не будет выполнена: 4 кандидата ab c d; 5 избирателей
voter| votes
1 | b c a d
2 | a d b c
3 | a d b c
4 | d a c b
5 | d a c b
"b" и "c" будут исключены. В таблице, кандидат "а" должен получить голос от избирателя 1. Но будут ли они? Поскольку функция перебирает кандидатов, нет. Когда он обрабатывает кандидата «а», он не ранжируется и не исключается; это не получает голоса. И это не будет обработано снова. Исходя из этого, я думаю, что программа должна l oop через ряды вместо кандидатов. Как только подсчет голосов закончится, закончите это l oop.