学习全排列算法

本文探讨了在8*8的国际象棋盘上放置8个“车”,使其处于安全状态的不同方式的数量问题。通过排列组合的方法,得出安全状态总数为8!=40320,并提供了一种递归算法实现思路。
问题描述:将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);

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受不了。那位牛人知道这个实现的优化,请不吝指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值