Я пытаюсь переставить набор точек в java с ограничением, что все точки в нечетном положении n не могут появиться перед точкой в позиции (n-1), т. Е. С учетом двух точек 1 и 2, 2 не может появиться до 1 в любой из перестановок и заданных точек 1,2,3 & 4, множество ожидаемых перестановок являются:Как переставить набор точек с ограничениями?
1,2,3,4
1,3,2,4
1,3,4,2
3,1,2,4
3,4,1,2
3,1,4,2
настоящее время у меня следующий код для нахождения перестановок:
static void permute(int[] a, int k,int[] p) {
if (k == a.length) {
for (int i = 0; i < a.length; i++) {
System.out.print(" " + a[i]);
}
System.out.println();
}
else {
int temp;
for (int i = k; i < a.length; i++) {
if(i % 2 == 0){
temp = a[k];
a[k] = a[i];
a[i] = temp;
permute(a, k + 1,p);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
else{
if(k > p[i]){
temp = a[k];
a[k] = a[i];
a[i] = temp;
permute(a, k + 1,p);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
}
}
, но мой ток выход:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 3 2
1 4 2 3
3 2 1 4
3 2 4 1
3 1 2 4
3 1 4 2
3 4 1 2
3 4 2 1
Любая помощь будет очень ценна :-)
Эти виды упражнений хорошо документированы и все они решены путем применения обратного отслеживания. Вы можете посмотреть этот http://www.fas.harvard.edu/~cscie119/lectures/recursion.pdf, где вы найдете шаблон для алгоритмов обратного отслеживания на стр. 18, поскольку все они выглядят одинаково. Более обобщенные версии также переносят данные в узлах, чтобы упростить повторное использование. –
Можете ли вы объяснить правило более точно? Если «все точки в нечетном положении n не могут появиться перед точкой в позиции (n-1)», как 3 (которые находятся в нечетном положении (3) появляются до 2? Почему правило применяется только к «1» и '2', если ваш пример имеет номера 1,2,3,4? – MrSmith42
@ MrSmith42: Возможно, он имел в виду «ровный»? Так что 2 не может появиться до 1, а 4 не может появиться до 3. –