全排列是指所有个体参与排列,考虑顺序
例如给定一个字符串,要求输出它的全排列
解:
public class Main {
static void fun(char[] c, int k) {// c:待排序的字符串,k:当前要考虑的位置
// 到达最后一个字符的位置时,字符串已经无法改变,直接输出
if (k == c.length - 1) {
System.out.println(String.valueOf(c));
return;
}
for (int i = k; i < c.length; i++) {
{// 交换其中两个元素的位置
char a = c[k];
c[k] = c[i];
c[i] = a;
}
fun(c, k + 1);
{// 回溯,变回原来的顺序
char a = c[k];
c[k] = c[i];
c[i] = a;
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
char[] c = s.toCharArray();
fun(c, 0);
}
}
蓝桥杯の搭积木
小明最近喜欢搭数字积木。一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
解:
public class Main {
static int num = 0;
static void fun(int[] a, int k) {
if (k == a.length - 1) {
// 上面的积木要比放在它下面的两个积木都小
if (a[0] < a[1] && a[0] < a[2])
if (a[1] < a[3] && a[1] < a[4])
if (a[2] < a[4] && a[2] < a[5])
if (a[3] < a[6] && a[3] < a[7])
if (a[4] < a[7] && a[4] < a[8])
if (a[5] < a[8] && a[5] < a[9])
num++;
}
for (int i = k; i < a.length; i++) {
{
int b = a[i];
a[i] = a[k];
a[k] = b;
}
fun(a, k + 1);
{
int b = a[i];
a[i] = a[k];
a[k] = b;
}
}
}
public static void main(String[] args) {
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
fun(a, 0);
System.out.println(num);
}
}
答案:768