В рамках школьного проекта мне нужно написать функцию, которая будет принимать целое число N и возвращать двумерный массив каждой перестановки массива {0, 1, ... , N-1}. Объявление будет выглядеть как общедоступные статические int [] [] перестановки (int N).
Алгоритм, описанный на http://www.usna.edu/Users/math/wdj/book/node156.html - вот как я решил реализовать это.
Я довольно долго боролся с массивами и массивами ArrayLists и ArrayLists of ArrayLists, но пока что я ' Мы были разочарованы, особенно пытаясь преобразовать 2d ArrayList в 2d массив.
Поэтому я написал его на javascript. Это работает:
function allPermutations(N) {
// base case
if (N == 2) return [[0,1], [1,0]];
else {
// start with all permutations of previous degree
var permutations = allPermutations(N-1);
// copy each permutation N times
for (var i = permutations.length*N-1; i >= 0; i--) {
if (i % N == 0) continue;
permutations.splice(Math.floor(i/N), 0, permutations[Math.floor(i/N)].slice(0));
}
// "weave" next number in
for (var i = 0, j = N-1, d = -1; i < permutations.length; i++) {
// insert number N-1 at index j
permutations[i].splice(j, 0, N-1);
// index j is N-1, N-2, N-3, ... , 1, 0; then 0, 1, 2, ... N-1; then N-1, N-2, etc.
j += d;
// at beginning or end of the row, switch weave direction
if (j < 0 || j >= N) {
d *= -1;
j += d;
}
}
return permutations;
}
}
Итак, как лучше всего перенести это на Java? Могу я сделать это только с примитивными массивами? Нужен ли мне массив ArrayLists? Или ArrayList из ArrayLists? Или есть какой-то другой тип данных лучше? Что бы я ни использовал, мне нужно иметь возможность преобразовать его обратно в массив примитивных массивов.
Может быть, есть лучший алгоритм, который упростил бы это для меня ...
Заранее благодарю вас за ваш совет!