пока не понятно, что именно собираешься реализовывать, попробую показать как я это вижу
1. рассмотрим все перестановки (алгоритм)
1.1. выбрали один элемент
1.2. из оставшихся следующий
1.3. из оставшихся следующий и т.д...
2. рассмотрим перестановки с учётом групп. Чтобы внутри групп не получилось таких, которые из группы получаются перестановкой, будем всегда выбирать так, чтобы следующий элемент был больше предыдущего, то есть группа должна быть всегда отсортирована по возрастанию.
3. чтобы не стало так чтобы группа i+1 получалась из группы i перестановкой, первые элементы групп должны быть так же отсортированы по возрастанию. То есть выбираем только из тех оставшихся, которые больше, чем первый элемент в предыдущей группе.
4. в качестве элементов используем изначально упорядоченный массив чисел 1..N*K, т.к. для них применима операция сравнения.
Пример для 4-х элементов:
Код:

a b c d a<b, c<d, a<c
a c b d a<c, b<d, a<b
a d b c a<d, b<c, a<d
алгоритм перебора: последовательно выбираем все элементыв сортированном списке и помечае отобранные
1. выбирать первые элементы групп лучше с начала списка (и не трогать последние K-1)
2. выбирать остальные элементы групп лучше с конца списка, чтобы хватило для заполнения самых последних групп
Таким образом переберёшь все и ни разу не повторишься