蓝桥杯16弹

第一题

import java.util.Scanner;

public class Main1 {
	int [] arr = new int [10];
	int [] book = new int [10];
	int n;
	public static void main(String[] args) {
		Main1 dd = new Main1();
		Scanner sc = new Scanner(System.in);
		dd.n = sc.nextInt();
		for(int i =0;i<10;i++){
			dd.book[i]=0;
		}
		dd.dfs(1);
	}

	public  void dfs(int step){
		if(step==n+1){
			for(int i =1;i<=n;i++){
				System.out.print(arr[i]+" ");
				}
			System.out.println();
				return;
			
		}
		for(int i =1;i<=n;i++){
			if(book[i] == 0){
				arr[step] = i; // 把第i张牌放在第step桶里
				book[i] = 1; // 把该张牌(i)标记为1;说明该张牌已经不掌握;
				dfs(step+1); // 执行下一步
				// System.out.println(i);
				book[i] = 0; 
			}
		}
		 // return ;
	}
}

思路:book[i]==0,表示数字为i的牌可以用,如果可用,就把i赋给arr[step],然后针对i++接着递归往后进行,并且step++,当step==4,就把arr[]数组里的n个数输出,然后开始从末尾回溯,依次把符合条件的i加入arr[step]数组。 

 第二题

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    static int []arr= {1,2,3,4,5,6,7,8,9,10};
	    static int count_num=0;
	    public static void DFS(int i,boolean root[],int x[]) {
	        if(i>=10) {
	            count_num++;
	            return;
	        }
	        else {
	            for(int j=0;j<10;j++) {  //用来确定那张牌可用的基础
	                if(i==0||(Math.abs(arr[j]-x[i-1])!=1&&!root[j])){//判断当前数字和前一个是否相邻
	                	//为什么就是当前数和前一个呢?因为之前用过的数字root[i]是true,直接跳过if语句的所有代码,
	                	//只有到了当前没用过的数字,才可以跟前一个数字比较。
	                    x[i]=arr[j];//不相邻把当前数字赋给x[i],方便下一次判断
	                    root[j]=true;//用过的话,标记一下,下一次不能用。
	                    DFS(i+1,root,x);//
	                    x[i]=0;//回溯过程中把x[i]的内容都修改为原始的。
	                    root[j]=false;//从最后一个开始回溯
	                }
	            }
	        }
	    }
	    public static void main(String[] args) {
	        boolean []root=new boolean[10];
	        int []x=new int[10];
	        DFS(0,root,x);
	        System.out.print(count_num);
	    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值