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

Понравилась задача по генерации элементов в двумерный массив. Смысл задачи в том, что имеется массив, размерностью 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-й колонок местами



Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

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

  • Vladimir говорит:

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




    0



    0
  • 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

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

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

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




    0



    0
  • Vladimir говорит:

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

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




    0



    0
    • admin говорит:

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

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




      0



      0
  • Vladimir говорит:

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




    0



    0
    • admin говорит:

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




      0



      0

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

Ваш e-mail не будет опубликован.

Поиск

 
     

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

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

У программиста есть два состояния: "Втупляю" и "Попёрло". (C) Gen

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок