Мой код не будет печататься при отправке на проверку кода, даже если он компилируется без ошибок

#c

Вопрос:

Мне был задан этот вопрос для моей лаборатории (и да, я понимаю, что будет отрицательная реакция, потому что это домашнее задание). Я работал над этим вопросом в течение нескольких дней безрезультатно, и мне кажется, что я упускаю что-то совершенно очевидное.

Мой код:

 int processSuitors(vector<int>amp; currentSuitors, list<int>amp; rekt)
{
   int sizeSuitors = currentSuitors.size();
   int eliminated = 2;
   
   while(sizeSuitors != 1)
   {
      rekt.push_back(currentSuitors[eliminated]);
      currentSuitors.erase(currentSuitors.begin()   eliminated);
      sizeSuitors--;
      
      if(eliminated > sizeSuitors)
      {
         eliminated -= sizeSuitors;
      }
   }
   return currentSuitors[0];
}
 

Незамедлительный:
В древней стране у прекрасной принцессы Евы было много поклонников. Она решила провести следующую процедуру, чтобы определить, за какого жениха она выйдет замуж. Во-первых, все претенденты будут выстроены один за другим и им будут присвоены номера. Первым претендентом будет номер 1, вторым-номер 2, и так далее, вплоть до последнего претендента, номер n. Начиная с первого претендента, она затем отсчитала бы трех претендентов по очереди (из-за трех букв в ее имени), и третий претендент был бы исключен из выигрыша ее руки, и он был бы удален из очереди. Затем Ева продолжила бы, подсчитав еще трех претендентов и исключив каждого третьего претендента. Когда она дойдет до конца очереди, она продолжит отсчет с самого начала.

Напишите функцию с именем processSuitors, которая принимает в качестве аргументов вектор STL типа int, содержащий претендентов, и список STL типа int, который соберет всех исключенных претендентов. Функция возвращает значение int, в котором хранится позиция, в которой должен находиться жених, чтобы жениться на принцессе, если есть n женихов. Функция, вызывающая processSuitors, отправит вектор, уже заполненный n претендентами (1, 2, 3… n), и пустой список, который необходимо заполнить номером позиции исключенных претендентов в порядке их исключения.

Ограничения: Вы не можете создавать какие-либо контейнеры (ни массивов, ни векторов и т.д.); вам необходимо использовать вектор и список, которые передаются в качестве параметров. Используйте ТОЛЬКО следующие функции STL:

 vector::size
vector::erase
vector::begin
ist::push_back
vector::operator[ ]
 

Соседние файлы скрыты, так как мы должны полагаться на то, что дано. Любая очистка моего кода также была бы чрезвычайно признательна.

Комментарии:

1. return currentSuitors[0] — А что, если этот вектор пустой? Доступ к элементу 0 является неопределенным поведением, если это так.

2. Где вы увеличиваете eliminated ? Согласно вопросу, индекс должен быть увеличен. Например: номер 3, 5,7…и т.д. Согласно «Ева затем продолжила бы, подсчитав еще трех претендентов и устранив каждого третьего претендента».

3. Вы должны написать код и создать свои собственные тестовые примеры, чтобы проверить свою логику с помощью отладчика. Не пяльтесь в бездну и не пытайтесь вытащить жука. Бездна не будет смотреть в ответ так, как ты хочешь.

4. Ваш код устранит претендентов 3, 4, 5, … n, 2 (имейте в виду, что векторная индексация начинается с 0, поэтому претендент 1 является элементом с индексом 0). Код должен исключить претендентов: 3, 6, 9, …, при достижении конца он должен начинаться спереди, таким образом, во втором раунде устраняя 4, 8 и т.д. Попробуйте создать несколько небольших тестовых примеров, решить их вручную, а затем попробуйте переписать решение.

5. Неясно, что произойдет, когда останутся только 1-е 2 претендента, потому что, если мы исключим каждого 3-го претендента, претенденты 1 и 2 не будут удалены. Так кого же из них выберет принцесса? 1-й или 2-й, так как нет 3-го жениха, которого нужно устранить!

Ответ №1:

Что вы думаете об этом решении?

Сохраните другой вектор, который отмечает, был ли удален индекс в вашем currentSuitors векторе. Затем есть вспомогательная функция, которая всегда найдет следующий свободный индекс.

Вместо того, чтобы пытаться уменьшить текущие требования, вы просто продолжаете отмечать элементы в списке принятых.

 size_t findNextFreeSlot(const vector<bool>amp; taken, size_t pos)
{
    // increment to the next candidate position
    pos = (pos   1) % taken.size();

    // search for the first free slot
    for (size_t i = 0; i < taken.size(); i  )
    {
        if (taken[pos] == false)
        {
            return next;
        }
        pos = (pos   1) % taken.size();
    }

    // assert(false); // we should never get here as long as there's one free slot index in taken
    return -1;
}

int processSuitors(vector<int>amp; currentSuitors, list<int>amp; rekt)
{
    size_t len = currentSuitors.size();
    vector<bool> taken(len);   // keep a vector of eliminated indices from current
    size_t index = len;        // initialize one past the last valid element
    size_t eliminated = 0;

    if (len == 0)
    {
        return -1;
    }

    while (eliminated < (len-1))
    {
        // advance the index three times to the next "untaken" index
        index = findNextFreeSlot(taken, index); 
        index = findNextFreeSlot(taken, index); 
        index = findNextFreeSlot(taken, index); 
        
        taken[index] = true;  // claim this index as taken
        rekt.push_back(currentSuitors[index]);  // add the value at this index to the eliminated list
        eliminated  ;
    }

    index = findNextFreeSlot(taken, index); // find the last free index

    return currentSuitors[index];
}