假设有2个A,2个B,2个C
我想表达的思路是这样的
首先将一个A组合 接下来是两个A,它们都是只有一个组合的
A
AA
一个B和两个A的时候
BAA
ABA
AAB
两个B和两个A的时候
B BAA
B ABA
B AAB
ABBA
ABAB
AABB
相当于把两A两B的看成相同的数,那就是4个字符之间有5个空个C插入,那就是5*(两A两B组合的数)=30
C BBAA
C BABA
C BAAB
C ABBA
C ABAB
C AABB
A C BBA
A C BAB
A C ABB
B C AAB
B C ABA
B C BAA
AA C BB
BB C AA
AB C AB
AB C BA
BA C AB
BA C BA
AAB C B
ABA C B
BAA C B
BBA C A
BAB C A
ABB C A
AABB C
ABAB C
ABBA C
BABA C
BAAB C
BBAA C
好,废话不多说,直接上代码
package cn.LanQiaoBeiAlgorithm.Ravanla;
public class n_A_m_B_k_C_Array {
public static void main(String[] args) {
int n = 2;//A
int m = 2;//B
int k = 1;//C
System.out.println(f(n, m)*f(n+m, k);// 这里为什么要用乘法呢, 可以看上面两B 和两A 和一C的组合例子
// A和B 组合好了有六组,C再跟他们的组合就是在他们之间找空位插入组合
}
//组合方法
//假如只有1个A和1个B,把这个组合分两个阵营,一个是A阵营(A开头),一个是B阵营(B开头)
//接下来就都交给递归去处理分阵营的问题了
private static int f(int n, int m) {
if(n == 0 || m == 0) return 1;
return f(n - 1, m) + f(n, m - 1);
}
}
//https://blog.csdn.net/weixin_43584220/article/details/88910775
打好草稿的时候我Eclipse坏了,验证不了代码准确性,只能拿我之前写过的改改了
Intellij IDEA还不会用
//加多三个D
int n = 2;//A
int m = 2;//B
int k = 1;//C
int j = 3;//D
System.out.println(f(n, m) * f(n+m, k) * f(n+m+k, j);