Двумерные массивы. Генерация уникальных элементов для каждой строчки и столбца

Понравилась задача по генерации элементов в двумерный массив. Смысл задачи в том, что имеется массив, размерностью N*N клеток. Каждую строчку надо заполнить значениями от 1 до N и каждую колонку надо заполнить значениями от 1 до N, причем ни в одной из строчек и ни в одной из колонок не должны встретится дубликаты.
Алгоритм решения этой задачи весьма прост: начинать заполнение каждой новой строки (или колонки) двумерного массива со значения, на единицу большего элементу предыдущей строки (или колонки), а после заполнения двумерного массива значениями — просто перемешать колонки и перемешать строки. Заполнение построчно или поколоночно определяется большим числом (больше строк — построчно, больше колонок — поколоночно).
ПРАВИЛЬНО
НЕПРАВИЛЬНО

1 2 3
3 1 2
2 3 1

1 2 3
2 3 1
2 1 3

Поскольку создаются таблицы с разным числом строк и разным числом колонок, выделение памяти и зачистка происходит при каждой необходимости воссоздать подобие массива.
Мне очень хотелось решить эту задачу не на квадратном массиве, а на любом прямоугольном. Из-за возможного разнобоя в числе строк и числе колонок нужно использовать два варианта заполнения: или заполнять обычным способом (построчно), или заполнять массив не очень привычным многим способом (поколоночно). Если этого не сделать, то в определённых случаях начнут случаться повторения, которых, согласно задаче, быть не должно.
Чтобы сделать массивы более-менее симпатичными — я использовал и перемешивание строк, и перемешивание колонок.
На заметку: Здесь использован механизм перемены мест колонок. Простой пример смены 1-й и 2-й колонок местами



6 комментариев на «“Двумерные массивы. Генерация уникальных элементов для каждой строчки и столбца”»

  1. Vladimir:

    На главной странице 2 ссылки подряд на эту страницу

  2. Vladimir:

    хм.. решения данной матрицы любой размерности как сразу пришло в голову только посмотрел на 2 ваши матрицы, тут одно вроде несложное правило, каждую следующую строку нужно сдвигать на 1 и повторений ни в строке ни в столбцах не будет, например первая строка у нас 1234567890, вторую строку сдвигаем на 1 и получаем 0123456789, далее следующую строку сдвигаем еще на 1 и получаем 9012345678, тое сть при сдвиге последнее число переносим на место первого и получаем матрицу где не в строке не в столбце нет повторений
    1 2 3 4 5 6 7 8 9 0
    0 1 2 3 4 5 6 7 8 9
    9 0 1 2 3 4 5 6 7 8
    8 9 0 1 2 3 4 5 6 7
    7 8 9 0 1 2 3 4 5 6
    6 7 8 9 0 1 2 3 4 5
    5 6 7 8 9 0 1 2 3 4
    4 5 6 7 8 9 0 1 2 3
    3 4 5 6 7 8 9 0 1 2
    2 3 4 5 6 7 8 9 0 1

    хм.. также можно сдвигать на любое кол-во шагов не равное или не превышающее размерность матрицы тогда все будет выглядеть хаотичнее но не будет повторений.

    Автор сайта отвечает:
    Не пройдёт этот способ. См. рисунок.

    Рано или поздно пойдут повторения.

  3. Vladimir:

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

    И еще, почему когда я нажимаю на «Ответить» под чьим то комментарием то ничего не происходит? Просто исчезает написанный текст.

    • Матрица любой размерности — это матрица любой размерности, а не квадратная. Наверное комментарием выше имелось в виду квадратная матрица с произвольным количеством элементов в своей стороне.

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

  4. Vladimir:

    Чтобы повторений не было, ни одна из размерностей массива (будь то строки или столбцы) не должно превышать количество (уникальных) элементов

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/allen-b-dauni/cifrovaya-obrabotka-signalov-na-yazyke-python-22998155/?lfrom=15589587
Яндекс.Метрика