我有这个问题,我需要从给定的排列中生成不是所有组合,而只是在排列 2 个位置且不重复后获得的组合。它被称为给定排列的区域,例如给定 1234 我想生成:
2134
3214
4231
1324
1432
1243
任何给定排列的区域大小为 n(n-1)/2 ,在本例中为 6 个组合。
现在,我有这个程序,他做的比我想要的多,他生成了所有 24 种可能的组合:
public class PossibleCombinations {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("Entrer a mumber");
int n=s.nextInt();
int[] currentab = new int[n];
// fill in the table 1 TO N
for (int i = 1; i <= n; i++) {
currentab[i - 1] = i;
}
int total = 0;
for (;;) {
total++;
boolean[] used = new boolean[n + 1];
Arrays.fill(used, true);
for (int i = 0; i < n; i++) {
System.out.print(currentab[i] + " ");
}
System.out.println();
used[currentab[n - 1]] = false;
int pos = -1;
for (int i = n - 2; i >= 0; i--) {
used[currentab[i]] = false;
if (currentab[i] < currentab[i + 1]) {
pos = i;
break;
}
}
if (pos == -1) {
break;
}
for (int i = currentab[pos] + 1; i <= n; i++) {
if (!used[i]) {
currentab[pos] = i;
used[i] = true;
break;
}
}
for (int i = 1; i <= n; i++) {
if (!used[i]) {
currentab[++pos] = i;
}
}
}
System.out.println(total);
}
}
问题是我怎样才能修复这个程序,把它变成一个只生成想要的组合的程序。