蓝桥杯练习——3.19深度优先遍历搜索

文章介绍了如何使用Java编程解决两个问题:一是生成1到n的全排列,二是计算编号相邻的书不能放在相邻位置的图书排列方案数。通过递归算法,对数组进行操作,实现了无重复的全排列输出以及满足特定条件的图书排列计数。
摘要由CSDN通过智能技术生成

目录

1.全排列问题

 2.图书排列


1.全排列问题

按照字典序输出自然数 1到 n所有不重复的排列,即 n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n。1≤n≤9
输出格式
由1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5个场宽。

思路:

n个数(无重)的全排列,就是将n个数分别放在第零个位置,再将剩下的n-1个数的全排列加在面,当n-1=1时为递归的出口。

m标记数组当前位置,即m=0时,对arr[0]到arr[length-1]排列;m=1时,对arr[1]到arr[length-1]全排列...以此类推,length为数组长度

代码:

import java.util.Scanner;
public class t6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		System.out.println("输入一个整数:");
		int n=scanner.nextInt();
		//int total=1;
		int[] arr=new int[n];
		for(int x=1;x<=n;x++) {
				arr[x-1]=x;//对arr中的元素赋值
		}
		test(arr, 0);
	}
	private static void test(int[] arr , int m) { 
        int length = arr.length;
        if(m>=length-1) {//当m定位到最后一个数时,即到递归出口
            	for(int x=0;x<arr.length;x++) {
            		if(x%5==0) {//每行到5个数时切换到下一行
            			System.out.println();
            			}
            			System.out.print(arr[x]+"\t");
            	}
        }else {
            for(int i=m;i<length;i++) {//将length-n个数分别放在第n个位置,(length-n)对于上文分析中的m
                {
                int temp = arr[m]; 
                arr[m] = arr[i]; 
                arr[i] = temp;
                }//以交换位置的方式实现
                test(arr,m+1);//对剩下的length-n-1个数全排列
                {
                int temp = arr[m]; 
                arr[m] = arr[i]; 
                arr[i] = temp;
                }//恢复原来的顺序,进行下一次交换
            }
        }
	}
}

结果:

 2.图书排列

将编号为 1 ~ 10 的 10本书排放在书架上,要求编号相邻的书不能放在相邻的位置。

请计算一共有多少种不同的排列方案。

思路:

将图书编号放入数组,进行全排列列出所有不重复的排列可能,定义方法check()检查相邻书是否是相邻书号,书号不相邻ant排列方案增加。

代码:

public class t7 {
	static int[] arr={1,2,3,4,5,6,7,8,9,10};
	static int ant=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	    test(arr, 0);
	    System.out.println(ant);
	}
	private static void test(int[] arr , int m) { 
	        int length = arr.length;
	        if(m>=length-1) {//当m定位到最后一个数时,即到递归出口
	           if(check()){
	             ant++;
	           }
	        }else {
	            for(int i=m;i<length;i++) {//将length-n个数分别放在第n个位置,(length-n)对于上文分析中的m
	                {
	                int temp = arr[m]; 
	                arr[m] = arr[i]; 
	                arr[i] = temp;
	                }//以交换位置的方式实现
	                test(arr,m+1);//对剩下的length-n-1个数全排列
	                {
	                int temp = arr[m]; 
	                arr[m] = arr[i]; 
	                arr[i] = temp;
	                }//恢复原来的顺序,进行下一次交换
	            }
	        }
	  }
	      private static boolean check() {
	        int n = arr.length;
	        for (int i = 0; i < n-1; i++) {
	            if (Math.abs(arr[i]-arr[i+1]) == 1) {
	                return false;
	            }
	        }
	        return true;
	      }
}

结果:

479306

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值