Сложные перестановки без повторения - PullRequest
2 голосов
/ 15 января 2012

Я пытаюсь создать инструмент для игры под названием Monster Hunter (для личного использования).Я работал с перестановками раньше, но ничего сложного, поэтому я полностью застрял.

В игре вы носите 5 единиц брони.Каждая часть имеет очки навыков для одного из множества различных навыков.Если у вас есть 10+ очков навыка в определенном навыке после вычисления всего набора, вы получаете этот навык.

Пример:

Foo Head: Attack +2, Guard + 2
Foo Chest: Defense + 5    
Foo Body: Guard + 2, Attack + 5, Defense +2
Foo Arm: Attack + 3, Speed + 4
Foo Legs: Attack + 5, Guard + 6, Defense + 3

The above set would result in 10+ in Attack, Defense, and Guard (not speed).

Я хотел бы выяснить, как найти все комбинациидоспехов с 2-3 указанными навыками.Таким образом, если вы выбрали «Атака» и «Скорость», это дало бы вам все возможные комбинации из 5 частей брони, что приведет к +10 как в «Атаке», так и в «Скорости».Существует около 60 различных предметов для каждой из 5 категорий.

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

Хотелось бы, чтобы у меня был рабочий код, чтобы показать, но я так потерянна данный момент я не знаю с чего начать.Я не ищу ответ, как таковой, но совет о том, как туда добраться.Спасибо.

1 Ответ

1 голос
/ 15 января 2012

1) Я бы попытался найти только один навык, а затем отфильтровать этот набор предметов для второго / третьего

2), чтобы не занимать слишком много времени / памяти / рекурсии: я бы отсортировал 5 *60 предметов основаны только на этом умении.Затем я буду создавать комбинации, ища те, которые в сумме составляют более 10, начиная с верхних навыков и заканчивая либо при достижении 10, либо когда оно не будет достигнуто.
Функция, которая строит все комбинации, будетПохоже: 1: если у нас есть общий навык предмета> 10: все комбинации с другими предметами в порядке.стоп.2: если текущим навыком предмета является число <10, ищите в массиве следующий самый большой предмет для неизнашиваемой фигуры. <br>если в массиве мы достигли 0 ИЛИ мы достигли значения, такого что (текущий счет + значение * количество фигурывведите left) <10, затем его время остановиться: -) <br>В противном случае добавьте счетчик умений, отметьте часть используемого типа брони, затем вызовите вашу функцию для всех предметов, которые могут совпадать.

ну, я могуне достаточно точно, но вы видите идею: используйте условие для вызова, чтобы избежать взрыва рекурсивности.Потому что 60 * 60 * 60 * 60 * 60 - это много.и (быстрая) сортировка 5 * 60 = 300 элементов - это ничто.

Для хранения ваших комбинаций вы можете добавить случай «все идет», чтобы избежать сохранения / вычисления слишком большого количества комбинаций ни за что.(например: если у вас есть Carmak's Magical Hat, у вас +100 в коде, и вы можете одеваться так, как хотите, ошибки будут окрашиваться! :-))

...