生活是一种绵延不绝的渴望,渴望不断上升,变得更伟大而高贵。 —— 杜伽尔
question:图书排列
将编号为1~10的10本书排放在书架上,要求编号相邻的书不能放在相邻的位置。
请计算一共有多少种不同的排列方案。
注意,需要提交的是一个整数,不要填写任何多余的内容。
//使用全排列,期间适当时机剪断搜索
Code:
package com.lanqiao;
import java.util.Vector;
public class fianllq1 {
private static long num;
public static void f(Vector<Character> source,Vector<Character> result) {
//完成排列
if(source.size()==0) {
// for(int i=0;i<=result.size()-1;i++) {
// System.out.print(result.elementAt(i));
// }
num++;
//System.out.println("");
return;
}
for(int i=0;i<source.size();i++) {
Vector<Character> tsource=new Vector<>(source);
Vector<Character> tresult=new Vector<>(result);
tresult.add(tsource.elementAt(i));
tsource.remove(i);
//剪断
if(tresult.size()>1) {
if(tresult.elementAt(tresult.size()-1)==((char)(tresult.elementAt(tresult.size()-2)+1))||(tresult.elementAt(tresult.size()-1)==((char)(tresult.elementAt(tresult.size()-2)-1)))) {
//System.out.println(tresult.elementAt(tresult.size()-1)+"==========>"+((char)(tresult.elementAt(tresult.size()-2)))+"-------");
tsource.add(tresult.elementAt(tresult.size()-1));
tresult.remove(tresult.size()-1);
continue ;
}
}
f(tsource,tresult);
}
}
public static void main(String[] args) {
Vector<Character> source=new Vector<>();
Vector<Character> result=new Vector<>();
for(int i=0;i<10;i++) {
source.add((char) ('A'+i));
}
f(source,result);
System.out.println(num);
}
}
answer:479306
以下代码是另一种解法,手懒,直接copy过来了,望作者见谅
package com.lanqiao;
import java.util.*;
public class fianllq2 {
static int res=0;
public static boolean check(int a[])
{
int l=a.length;
for(int i=0;i<l-1;i++)
{
// 两个相邻的元素,如果它们的数字是相邻的,就是两个元素相减的绝对值 == 1;那么就return false;
if(Math.abs(a[i]-a[i+1])==1)
{
return false;
}
}
return true;
}
// 将a[]中的a[x] 与 a[y] 的值互换
public static void swap(int a[],int x,int y)
{
int temp =a[x];
a[x]=a[y];
a[y]=temp;
}
public static void sort(int a[],int begin,int end)
{
if(begin==end)
{
// 检查相邻的书是否被放在了相邻的位置 :以数字来代表书;相邻两个数字的差的绝对值要不等于1
if(check(a))
// 如果相邻的两个数字的差的绝对值不等于1,则找到了一种方案。
res++;
}
for(int i = begin; i <= end; i++)
{
swap(a,begin,i);
sort(a,begin+1,end);
swap(a,begin,i);
}
}
public static void main(String[] args) {
int a[]={1,2,3,4,5,6,7,8,9,10};
sort(a,0,a.length-1);
System.out.println(res);
}
}