Генерация матриц на c++

89
22 апреля 2022, 14:10

возникла необходимость создавать с помощью c++ матрицы 10 на 10 из нулей и единиц (всегда 25 единиц и 75 нулей в случайных позициях). При этом генерировать их нужно не рандомно, подскажите каким образом это можно делать (примерный алгоритм или готовый код). Алгоритм должен (в теории) за конечное время перебрать все возможные варианты этих матриц.

Answer 1

Ладно, только раз, только у нас, только для вас.

Перенумеруем все решетки - число от 0 до 1125899906842623. Получить решетку по ее номеру можно вот так:

array<array<int,10>,10> Cardano(unsigned long long n)
{
    array<array<int,10>,10> m;
    for(int i = 0; i < 10; ++i)
        for(int j = 0; j < 10; ++j)
            m[i][j] = 0;

    for(int i = 0; i < 25; ++i)
    {
        int q = n&0x3;
        n >>= 2;
        int rr = i/5, cc = i%5, r, c;
        switch(q)
        {
        case 0: r = rr; c = cc;         break;
        case 1: r = cc; c = 9 - rr;     break;
        case 2: r = 9 - rr; c = 9 - cc; break;
        case 3: r = 9 - cc; c = rr;     break;
        }
        m[r][c] = 1;
    }
    return m;
}

Вот вам и способ перебора :) - цикл от нуля до 1125899906842623 включительно, и выводите себе...

Вот пример работы программы: https://ideone.com/D1QvjC

Answer 2

Делим матрицу на 4 квадрата, и нумеруем их: 0 - левый верхний, 1 - правый верхний, 2 - правый нижний, 3 - левый нижний

Нумеруем цифры внутри 0-го из квадратов от 0 до 24 слева на право, сверху вниз.

Внутри остальных трех квадратов нумеруем элементы от 0 до 24 так, чтобы они соответствовали номерам их 0-го при повороте на 90, 180 и 270 градусов соответственно.

Вот пример такой нумерации из Википедии, но матрица 8*8 и нумерация с 1, а не с нуля, но это не меняет сути

Теперь как собственно сгенерировать.

Берем 50-битное N от 0 до 1 125 899 906 842 623 - номер решетки, которую мы хотим сгенерировать.

Разбиваем его на 25 двухбитных чисел (от 0 до 3 каждое).

Номер двухбитной пары - это номер ячейки внутри квадрата, значение - номер квадрата, в котором ставим 1. В остальных трех квадратах в ячейке с этим номером ставим 0.

READ ALSO
сортировка очереди на основе массива

сортировка очереди на основе массива

Прошу помочь реализовать сортировку очереди, реализованную на основе массиваСортировка может быть любой, интересно было бы посмотреть быструю...

155
Ошибка Exception unhandled

Ошибка Exception unhandled

Помогите пожалуйста исправить оишбку

155
Решить выражение

Решить выражение

Вычисление выражений с использованием побитовых операцийЗадано целые числа a, b, c и d

133
Двойная задержка выполнения скрипта

Двойная задержка выполнения скрипта

Есть такой скрипт, на ардуино (крутит шаговый двигатель)Подскажите как сделать так чтобы этот скрипт выполнялся 10 секунд, потом была задержка...

121