题目:
5题 图书排列
题目描述
将编号为 1~10 的 10 本书排放在书架上,要求编号相邻的书不能放在相邻的位
置。
请计算一共有多少种不同的排列方案。
注意,需要提交的是一个整数,不要填写任何多余的内容。
题目解析:
这样的题重点在与什么,重点不在与全排列,全排列的方法公式基本上都一样,重点在于你写的check函数上,使用check函数来将与题意不符合的排列剔除。
Math.abs()是取绝对值
题目代码:
public class 图书排列 {
static int ans;
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
f(arr, 0);
System.out.println(ans);
}
private static void f(int[] arr, int k) {
if(k==10)
{
if(check(arr)){
ans++;
}
}
for (int i = k; i < arr.length; i++) {
int t=arr[i];
arr[i]=arr[k];
arr[k]=t;
f(arr,k+1);
t=arr[i];
arr[i]=arr[k];
arr[k]=t;
}
}
private static boolean check(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
if(Math.abs(arr[i]-arr[i+1])==1)
{
return false;
}
}
return true;
}
}
运行结果:
结后反思:
本题与2013年蓝桥杯的第九届的第九题差不多,重点不在与全排列,而在于check函数。