回溯法求全排列

N个元素的全排列数量是N!个,例如ABCD四个字母的排列数量是24个,而ABCDEFGH八个字母的排列数量是40320个。

回溯法是一种递归方法,不光有进,而且有退,试探进行。

	static void solve(char[] path, int index) {
		if (index == path.length) {
			System.out.println(new String(path));
			return;
		}
		for (int i = index; i < path.length; i++) {
			swap(path, i, index);
			solve(path, index + 1);
			swap(path, i, index);
		}
	}

第一次调用

		char[] nodes = "ABCD".toCharArray();
		solve(nodes, 0);

从位置0开始,也就是A的位置,if不成立,继续执行,到for循环,i=index=0,这时候swap实际不产生交换,因为是同一个位置,然后递归调用index+1也就是到了B的位置,同样不产生交换,到了C的位置,再到D的位置,最后到D的后面,if成立,输出一条结果。

然后递归调用逐层返回。又回到D的位置,因为后面没有更多元素,不产生交换,又返回到C的位置,先是C和C本身位置交换,也就是还原之前的位置,然后循环继续进行,C和D交换,然后继续递归调用两次,if满足,输出ABDC。

总得来说,要求ABCD的全排序,如果A确定,那就是求BCD的全排序。如果AB确定,就是求CD的全排列,如果ABC确定,剩下的就只有D一种可能。然后回退,C换一种可能,只能是D,因为AB在前面已经用了,那么后面剩下的只有C。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小艾米编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值