Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Массив всех возможных комбинаций из '0' и '1'

#c_sharp #алгоритм #комбинаторика


Нужно создать двумерный битовый (булевый) массив всех возможных комбинаций из 0 и
1 (false и true), размерность массива - параметр. Например, для входящего значения
3 результат должен быть

0   0   0,
0   0   1,
0   1   1,
1   0   0,
1   0   1,
1   1   1


Что-то завис. 
    


Ответы

Ответ 1



Если 010 и 110 пропущены случайно, то результат - это двоичные представления всех чисел от 0 до 2n-1: int size = 3; bool[][] result = Enumerable.Range(0, 1 << size) .Select(i => new BitArray(new int[] { i }).Cast().Take(size).ToArray()) .ToArray();

Ответ 2



Если интересуют именно все возможные комбинации, и нет острой необходимости иметь результат в виде массива, то можно создать класс, реализующий индексное свойство: public sealed class BitArray2D { private readonly int highestBitIndex; public BitArray2D(int bitsCount) { highestBitIndex = bitsCount - 1; } public bool this[int rowIndex, int colIndex] { get { return (rowIndex & (1 << (highestBitIndex - colIndex))) != 0; } } } Этот класс позволит не выделять лишнюю память, а будет просто быстро вычислять значения при обращении. Пример: var t = new BitArray2D(3); Console.WriteLine(t[3, 0]); // False Console.WriteLine(t[3, 1]); // True Console.WriteLine(t[3, 2]); // True

Ответ 3



Для языка PHP: $arr = range(0, 1<<$k-1);

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

Отправить комментарий