【算法】第八届蓝桥杯国赛之图书排列

生活是一种绵延不绝的渴望,渴望不断上升,变得更伟大而高贵。 —— 杜伽尔

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);  
    }  

}  

answer:479306

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值