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。