Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Комбинация по её номеру

Комбинация по её номеру

Поделиться
Advanced: Тема повышенной сложности или важная.
fornetjobПостоялецwww6 апр. 201721:06#0
Всем доброго вечера.

Есть массив массивов:

1: 1
2: 1, 2
3: 1, 2
4: 1

Необходимо иметь доступ ко всем комбинациям. Их общее количество получается достаточно просто - перемножением размерности дочерних массивов.
Т.к. таких комбинаций будет достаточно много хранить их в памяти и получать к ним доступ по индексу - не вариант :(

Я сделал некоторый алгоритм, который берёт требуемое число и делит на размерность дочернего массива. Если больше единицы - то выставляет его крайнее состояние и берёт следующий, если меньше - умножает остаток на размерность и завершает.
При индексе 0: 1, 1, 1, 1
При индексе 1: 1, 2, 1, 1
При индексе 3: 1, 2, 2, 1

Считаются верно, а
При индексе 2: 1, 1, 2, 1 считается неверно, как 2: 1, 2, 1, 1
Что, соответствует алгоритму, но не соответствует желаемому результату :(

Буду рад помощи :)

ZegalurПостоялецwww6 апр. 201722:36#1
Пусть есть k массивов.
Пусть n_j - размер j-го массива (j=1..k).

Пусть есть "комбинация" из элементов:
(i_1, i_2, ..., i_k) - где i_j-индекс элемента из в j-го массива (i_j=0..((n_j)-1))

тогда "индекс" будет:
i = i_1 + i_2 * (n_1) + i_3 * (n_1 * n_2) + ... + i_k * (n_1 * ... * n_(k-1))

откуда:
i_1 = i mod (n_1)
i_2 = ((i - i_1)/(n_1)) mod (n_2)
i_3 = ((i - i_1 -  i_2 * (n_1)) / (n_1 * n_2)) mod (n_3)
...


Например, пусть
n_1 = 1
n_2 = 2
n_3 = 2
n_4 = 1

Тогда
i = 0  =>  (0,0,0,0)
i = 1  =>  (0,1,0,0)
i = 2  =>  (0,0,1,0)
i = 3  =>  (0,1,1,0)

Оно?

P.S. Набросал по-быстрому, но вроде все ок..
fornetjobПостоялецwww6 апр. 201722:41#2
Да, оно. Сейчас попытаюсь разобраться :)
Я пока надумал обязать размерность быть кратной двум, переводить индекс в список битов и считать эти биты накладывая их на размерность.
fornetjobПостоялецwww6 апр. 201723:00#3
Всё работает, круто, спасибо :)

/ Форум / Программирование игр / Игровая логика и ИИ

2001—2017 © GameDev.ru — Разработка игр