问题描述:将8个"车"放在8*8的国际象棋盘上,如果他们两两均不能互吃,那么称8个"车"处于一个安全状态。问共有多少种不同的安全状态?
解题思路:8个车处于安全状态当且仅当它们处于不同的8行8列上。用一个排列A1,A2,A3,....A8,对应一个安全状态,使A1表示第i行的A1列上放置一个"车"。这种对应显然是一对一的。因此,安全状态的总数等于这个数的全排列总数8!=40320。
程序实现思路:设F(N) = N!,由于N!=N*(N-1)....2*1;那么有递归方程式: F(N) = N*F(N-1);
只可惜不能递归多层,10个字符的全排列就然JDK受不了。那位牛人知道这个实现的优化,请不吝指导。
解题思路:8个车处于安全状态当且仅当它们处于不同的8行8列上。用一个排列A1,A2,A3,....A8,对应一个安全状态,使A1表示第i行的A1列上放置一个"车"。这种对应显然是一对一的。因此,安全状态的总数等于这个数的全排列总数8!=40320。
程序实现思路:设F(N) = N!,由于N!=N*(N-1)....2*1;那么有递归方程式: F(N) = N*F(N-1);
public static List<StringBuffer> Pmin(char[] source, int len) {
// 当前全排列的结果集合
List<StringBuffer> currSet = new ArrayList<StringBuffer>();
// 递归出口
if(len == 1){
currSet.add(new StringBuffer(String.valueOf(source[0])));
return currSet;
}
List<StringBuffer> lstSet = null;
// 取得(N-1)!=N-1的全排列
lstSet = Pmin(source, len - 1);
//-----------------------------------------------------------------
// 对(N-1)!得到的排列字符集合进行字符插入操作,得到N!
//-----------------------------------------------------------------
// 插入字符
String currChar = String.valueOf(source[len - 1]);
for(int index = 0; index < lstSet.size(); index++){
StringBuffer currSb = lstSet.get(index);
for(int i = 0; i < currSb.length() + 1; i++){
StringBuffer nxtSb = new StringBuffer(currSb);
nxtSb.insert(i, currChar);
currSet.add(nxtSb);
}
}
return currSet;
}
只可惜不能递归多层,10个字符的全排列就然JDK受不了。那位牛人知道这个实现的优化,请不吝指导。