Как реализовать двухуровневое перечисление с перестановкой и n-choose-k? ⇐ C++
Как реализовать двухуровневое перечисление с перестановкой и n-choose-k?
Я пытаюсь написать программу, выполняющую перечисления квадратных матриц. Элементами матриц могут быть любые из трех символов: «.», «X» и «E». Перечисление параметризуется двумя значениями:
[*]W (что означает «размер слова») — количество строк в матрицах. Это также количество столбцов, поскольку матрицы квадратные. [*]E (что означает «дополнительные ненулевые записи») — это число от 0 до W2-W.
Теперь, учитывая W и E, цель состоит в том, чтобы перечислить все матрицы следующего вида:
[*]Существует ровно W элементов с буквами X. [*]В каждой строке и каждом столбце должен быть знак «X». [*]Есть ровно E-элементы, в которых есть E, и они не могут находиться там, где есть X. [*]Остальные элементы W2-W-E содержат '.'.
Программа принимает три аргумента командной строки: W, E и либо «x», либо «h». Программа перечислит все матрицы для W и E в любом порядке и распечатает их в одном из следующих двух форматов:
[*]Если последний аргумент равен «x», вы распечатаете матрицы в приведенном выше формате. Каждую матрицу следует распечатать в виде W строк из W символов: «.», «X» или «E». После каждой матрицы вы печатаете пустую строку. [*]Если последним аргументом является «h», то вы преобразуете каждую строку каждой матрицы в целое число и печатаете это целое число в шестнадцатеричном виде, без ведущих 0 и без ведущих «0x». Если элемент i в строке равен «X» или «E», то вы установите i-й бит числа равным 1. В противном случае i-й бит равен нулю. Вы будете печатать каждое целое число в отдельной строке и пустую строку в конце каждой матрицы.
Метод, который я использую, представляет собой двухуровневое перечисление: сначала перестановка матриц «X» с помощью рекурсивной функции, а затем выполнение «n select k» с другой рекурсивной функцией.
Вот что у меня сейчас есть:
#include #include #include #include использование пространства имен std; класс Матрица { публика: интервал W; интервал Е; чар П; вектор Пермь; вектор Non_X; вектор E_ID; недействительная печать () { если (P == 'x') { for (int i = 0; i < W; ++i) { строка row(W, '.'); row[Perm] = 'X'; for (int id: E_ID) { int r = id/W; int c = идентификатор% W; если (я == г) { строка[c] = 'Е'; } } cout
Я пытаюсь написать программу, выполняющую перечисления квадратных матриц. Элементами матриц могут быть любые из трех символов: «.», «X» и «E». Перечисление параметризуется двумя значениями:
[*]W (что означает «размер слова») — количество строк в матрицах. Это также количество столбцов, поскольку матрицы квадратные. [*]E (что означает «дополнительные ненулевые записи») — это число от 0 до W2-W.
Теперь, учитывая W и E, цель состоит в том, чтобы перечислить все матрицы следующего вида:
[*]Существует ровно W элементов с буквами X. [*]В каждой строке и каждом столбце должен быть знак «X». [*]Есть ровно E-элементы, в которых есть E, и они не могут находиться там, где есть X. [*]Остальные элементы W2-W-E содержат '.'.
Программа принимает три аргумента командной строки: W, E и либо «x», либо «h». Программа перечислит все матрицы для W и E в любом порядке и распечатает их в одном из следующих двух форматов:
[*]Если последний аргумент равен «x», вы распечатаете матрицы в приведенном выше формате. Каждую матрицу следует распечатать в виде W строк из W символов: «.», «X» или «E». После каждой матрицы вы печатаете пустую строку. [*]Если последним аргументом является «h», то вы преобразуете каждую строку каждой матрицы в целое число и печатаете это целое число в шестнадцатеричном виде, без ведущих 0 и без ведущих «0x». Если элемент i в строке равен «X» или «E», то вы установите i-й бит числа равным 1. В противном случае i-й бит равен нулю. Вы будете печатать каждое целое число в отдельной строке и пустую строку в конце каждой матрицы.
Метод, который я использую, представляет собой двухуровневое перечисление: сначала перестановка матриц «X» с помощью рекурсивной функции, а затем выполнение «n select k» с другой рекурсивной функцией.
Вот что у меня сейчас есть:
#include #include #include #include использование пространства имен std; класс Матрица { публика: интервал W; интервал Е; чар П; вектор Пермь; вектор Non_X; вектор E_ID; недействительная печать () { если (P == 'x') { for (int i = 0; i < W; ++i) { строка row(W, '.'); row[Perm] = 'X'; for (int id: E_ID) { int r = id/W; int c = идентификатор% W; если (я == г) { строка[c] = 'Е'; } } cout
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
C++, Code::Blocks, which project type should I choose for GUI in both windows and macos?
Anonymous » » в форуме C++ - 0 Ответы
- 161 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему перечисление всегда находится в том состоянии, в котором перечисление указано первым?
Anonymous » » в форуме C# - 0 Ответы
- 84 Просмотры
-
Последнее сообщение Anonymous
-