寒假作业(蓝桥杯)

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

public class Main {
    public static int[] a={1,2,3,4,5,6,7,8,9,10,11,12,13};
    public static int count = 0;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        dfs(0);
        System.out.println(count);
        scan.close();
    }
    //递归实现全排列(深度优先)
    public static void dfs(int k) 
    {
      if (k == 12) 
      {//如果是13个全部参与的话这里的k==12应该变为k==13
      if (judge())
      count++;
      return;
      // !!!一次全排列
      }
      for (int i = k;i<=12;i++) 
      {
        int temp = a[i];
        a[i] = a[k];
        a[k] = temp;
        dfs(k+1);
        temp = a[i];
        a[i] = a[k];
        a[k] = temp;//因为修改是对唯一的数组做了修改,为了不影响后续的排列,
        //每一次会递归完成并回到这里时都要将交换复原
        }
    }

        public static boolean judge(){
        if (a[1] + a[2] == a[3] && a[4] - a[5] == a[6] && a[7] * a[8] == a[9]&& (a[10] / a[11] == a[12] && a[10] % a[11] == 0)) 
        {// 必须判断余数为零
        return true;} 
        else {return false;}
      }//判断是否符合 
        
      
}

上述转载至2016蓝桥杯省赛---java---A---6(寒假作业) ,但运行超时。以及回溯的for循环全排列写的更像是组合。

基于此,参考蓝桥杯-寒假作业_Monkeyhour的博客-CSDN博客

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

public class Main {
    public static int[] nums = new int[20];
    public static int[] used = new int[20];
    public static int count = 0;
    //public static int k = 1;
    public static void dfs(int k){
      if(k>=4&&nums[1]+nums[2]!=nums[3]){
        return;
      }
      if(k>=7&&nums[4]-nums[5]!=nums[6]){
        return;
      }
      if(k>=10&&nums[7]*nums[8]!=nums[9]){
        return;
      }
      if(k>=13&&nums[10]/nums[11]==nums[12]&&nums[10]%nums[11]==0){
        count++;
        return;
      }
      for(int i=1;i<=13;i++){
          {
            if(used[i]==0){
            nums[k]=i;
            used[i]=1;
            dfs(k+1);
            used[i]=0;
            }
          }
        }
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        dfs(1);
        System.out.println(count);
        scan.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值