Простейший способ - перебирать каждую точку, получать расстояние между предыдущей и следующей точками и рекурсивно с полигоном без текущей точки; например для пятиугольника ABCDE, который был бы:
- расстояния ЕВА + рекурсия с четырехугольником BCDE
- расстояние переменного током + рекурсией с четырехугольником cdea
- расстояние о.-д. + Recurse с четырьмя лунками deab
- расстояние с + рекурсия с четырехугольником eabc
- расстояние да + рекурсия с четырехугольником ABCD
Для того, чтобы не вычислять то же решение более чем один раз, вы должны отбрасывать любые решения, в которых точки, которые уже были проверены, не имеют диагонали, входящей в них; например при рекурсии с четырехугольником deab на этапе 3 решение с диагональю eb является дубликатом, поскольку решения, которые используют треугольник abe, уже были проверены на первом этапе. Выполнение дублирующих расчетов вообще может быть затруднено с помощью этого метода.
Другой метод бы выбрать точку (обозначена красным на рисунке), а затем перечислить каждое решение в виде числа цифр, сумма которых составляет п - 2, где п есть число точек. Решение, в котором каждая диагональ проходит через выбранную точку, будет решением 11111. Затем вы выполняете каждую комбинацию, которая суммируется с n - 2: 11111, 1112, 1121, 113, 1211, 122, 131, 14, 2111, 212 , 221, 23, 311, 32, 41 и 5. Число больше 1 означает, что вы объединяете 2 или более сегментов и добавляете диагональ от первой до последней. Когда число больше 2, эта диагональ граничит с левым полигоном (обозначается розовым), с которым вы рекурсивете.
Анимация показывает итерации и рекурсии, которые алгоритм проходит для 7-точечного многоугольника, вплоть до точки, где он повторяется с 6-точечным многоугольником.
Оба эти методы дают возможности запоминания и подведение итогов, но это не будет просто. Пятиугольник, начинающийся в точке b, не обязательно bcdef после того, как вы начали рекурсию; это может быть bdfhj. Поэтому получение сохраненных промежуточных результатов может немного усложниться.
Можете ли вы объяснить, что это имеет отношение к C++? –
Извините, я пытался найти решение с использованием C++, но я новичок в этом, это просто, если кто-то хотел попробовать попробовать, это более знакомо C++ –
Это вопрос об алгоритме. Ответ на вопрос будет таким же, будет ли он закодирован в C++, Java, Python, Perl, PHP, Basic или любом другом языке программирования Turing. После того, как вы выясните, что такое алгоритм, попытайтесь запрограммировать решение на C++ и какие-то проблемы возникают, тогда это станет вопросом C++. Но не раньше. –