单纯针对数学问题而言,比如求123的所有不同次序有多少种?
123/132/213/231/312/321 一共六种
其实n个数就有n!种。
前提是不同的n位数。
对于全排列问题采用回溯法。
针对全排列不处理重复数字问题,代码如下:
若是考虑重复数字,则需要进行剪枝处理。
package lanqiao;
/*
* 不处理重复数字的全排列-回溯法模板
* void arrangement()全排列
*
*/
import java.util.Scanner;
public class Main{
public static final int N = 1000;
public static char[] str = new char[N];//输入的字符串
//public static char[] buf = new char[N];//符合条件的排列
//public static int[] vis = new int [N];//标记数组
public static int total = 0;//统计排列的个数
public static int len = 0;//输入字符串的长度
public static void arrangement(int b) {
if(b>=len) {
total++;
System.out.println(java.util.Arrays.toString(str));
}
for(int i = b;i<str.length;i++) {
{
char k=str[b];str[b]=str[i];str[i]=k;//选定第一位,对其他的进行操作
}
arrangement(b+1);
{
char k = str[b];str[b]=str[i];str[i]=k;//换回来再做处理
}
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
str = cin.next().toCharArray();
total = 0;
len = str.length;
arrangement(0);
System.out.println(total);
}
}