Оба решения @ LaC и @ MizardX очень интересны, но вы можете объединить их, чтобы получить еще лучшее решение.
Проблема с решением @ LaC заключается в том, что вы получаете случайный выбор, отклоненный.Чем больше очков вы уже заработали, тем сложнее получить новые.Если остается только одна доступная позиция, у вас есть небольшая вероятность случайного выбора ее (1 / (n * m)).
В решении @ MizardX вы никогда не получите отклоненные варианты, однако, если вы непосредственно реализуете "Удалите все точки из L, которые являются линейными по отношению к PQ. "На шаге сложность ухудшится (O (n ^ 5)).
Вместо этого было бы лучше использовать растровое изображение, чтобы найти точки из L, которые нужно удалить.Растровое изображение будет содержать значение, указывающее, может ли точка свободно использоваться и каково ее расположение в списке L, или значение, указывающее, что эта точка уже вычеркнута.Таким образом, вы получите сложность O (n ^ 4) в худшем случае, которая, вероятно, является оптимальной.
РЕДАКТИРОВАТЬ:
Я только что нашел этот вопрос: Генерировать невырожденную точкуУстановить в 2D - C ++ Это очень похоже на это.Было бы хорошо использовать решение из этого ответа Создать невырожденный набор точек в 2D - C ++ .Немного изменив его для использования сортировки по осям или сегментам и добавив все n ^ 2 возможных точек к исходному множеству P и перетасовав его, можно также получить сложность O (n ^ 4) в худшем случае с гораздо более простым кодом.Более того, если пространство - это проблема, а решение @ LaC невозможно из-за требований к пространству, то этот алгоритм просто подойдет без изменений и предложит приличную сложность.