【发布时间】:2018-04-12 21:59:03
【问题描述】:
我有两个数组(长度相同),大小是可变的。
做一个最简单的例子,我有两个长度为 3 的数组。
Persons -> P1, P2, P3
Seats -> Sa, Sb, Sc
我需要生成所有组合Cn
如果人P1取Sa,
有可能:
- 人
P2接受Sb然后P3将接受Sc。组合将是P1Sa, P2Sb, P3Sc。 - 或人
P2取Sc然后P3将取Sb。组合将是P1Sa, P2Sc, P3Sb。
现在在这里所有可能的组合。
C0 -> P1Sa, P2Sb, P3Sc
C1 -> P1Sa, P2Sc, P3Sb
C2 -> P1Sb, P2Sa, P3Sc
C3 -> P1Sb, P2Sc, P3Sa
C4 -> P1Sc, P2Sa, P3Sb
C5 -> P1Sc, P2Sb, P3Sa
这是我糟糕的设计。
private void recursiveSeatPerson(String c, List<String> p, List<String> s) {
if (p.size() > 1) {
for (int i = 0; i < s.size(); i++) {
String combination = p.get(0)+s.get(i) + ", " + c;
System.out.print(combination);
List<String> new_s = new ArrayList<>();
for (int index_s = 0; index_s < s.size(); index_s++) {
if (index_s != i) {
new_s.add(s.get(i));
}
}
List<String> new_p = new ArrayList<>();
for (int index_p = 1; index_p < p.size(); index_p++) {
new_p.add(p.get(index_p));
}
recursiveSeatPerson(combination, new_p, new_s);
}
} else {
System.out.print(c + p.get(0)+s.get(0) + " ");
System.out.println();
}
}
这是我的测试。
List<String> persons = Arrays.asList("P1", "P2", "P3");
List<String> seats = Arrays.asList("Sa", "Sb", "Sc");
recursiveSeatPerson("", persons, seats);
这是我的结果:
P1Sa, P2Sa, P1Sa, P2Sa, P1Sa, P3Sa
P2Sa, P1Sa, P2Sa, P1Sa, P3Sa
P1Sb, P2Sb, P1Sb, P2Sb, P1Sb, P3Sb
P2Sb, P1Sb, P2Sb, P1Sb, P3Sb
P1Sc, P2Sc, P1Sc, P2Sc, P1Sc, P3Sc
P2Sc, P1Sc, P2Sc, P1Sc, P3Sc
现在在这一行中发送类似空字符串的参数:
recursiveSeatPerson("", new_p, new_s);
这是糟糕的结果(再次)。
P1Sa, P2Sa, P3Sa
P2Sa, P3Sa
P1Sb, P2Sb, P3Sb
P2Sb, P3Sb
P1Sc, P2Sc, P3Sc
P2Sc, P3Sc
如何解决我的代码?
【问题讨论】:
-
谢谢,但是:我在等伪代码,把它传给Java,但由于我从来没有接触过python,所以我不明白算法的逻辑。由于使用 Java 对我的问题进行了更改,因此 Python 中的答案不适用。
标签: java algorithm recursion combinatorics