第八届蓝桥杯决赛 图书排列

标题:图书排列

将编号为1~10的10本书排放在书架上,要求编号相邻的书不能放在相邻的位置。
请计算一共有多少种不同的排列方案。

注意,需要提交的是一个整数,不要填写任何多余的内容。

答案:479306

分析

  • 简单题,只要dfs求出所有的排列情况,然后筛选出满足条件的排列情况并计算数目即可。
  • 注意点:如果不放心自己求出的结果,可以把满足条件的情况输出,方便排错。
    //发现我会写全排列hhh

代码如下

public class Main {

	public static boolean visit[]=new boolean[10];
	public static int a[]=new int [10];
	public static int ans=0;
	
	public static boolean check() {
		for(int i=0;i<9;i++)
			if(a[i]==a[i+1]+1 || a[i]==a[i+1]-1) 
				return false;
		return true;
	}
	
	public static void dfs(int x) {
		if(x==10) {
			if(check()) {
				ans++;
//				output conditions
//				for(int i=0;i<10;i++)
//					System.out.print(a[i]+" ");
//				System.out.println();
			}
			return;
		}
		for(int i=0;i<10;i++) {
			if(!visit[i]) {
				visit[i]=true;
				a[x]=i;
				dfs(x+1);
				visit[i]=false;
			}
		}
	}
	
	public static void main(String[] args) {
		dfs(0);
		System.out.println(ans);//output the result
	}
}
发布了59 篇原创文章 · 获赞 103 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42292229/article/details/90438301