2016年蓝桥---凑算法---全排列简单易懂

B DEF

A + --- + ------- = 10

​ C GHI

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:

6+8/3+952/714 就是一种解法,

5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

首先我给大家扣扣字眼:

  1. A~I代表1~9。意思是:有9个数字,这9个数字不存在重复情况。

  1. 两个示例。想表明的是:9个数字间任意组合,不同组合方式算一种。

所以,总的来说就是求,9不同数字间有多少种排列(组合)方式

要理解这道题大家可以先跳转这篇文章理解一下什么是全排列

全排列

这道题主要考察全排列也就是递归问题。在全排列基础上结合条件判断进行结果筛选,所以大家也要理解题目,知道条件判断应该放在什么位置,以及怎么判断才能得到想要的结果。

本题整体思路:

通过全排列,列出所有可能的结果。每列出一种结果就对其进行判断,如果符合要求则计数,否则进入下一种结果。

但是这道题大家要注意一个容易疏忽的地方。公式中存在除法,如果通过多个除法求和得到一个整数必然会省略掉除法中除不尽的小数,所以必然会造成精度问题,甚至得不到正确答案。所以要将等式转换为乘法等式进行运算,这样才能排除除法造成误差的可能。

接下来上代码(大家可以复制代码,尝试自己运行一下,帮助理解)

static int[] a={1,2,3,4,5,6,7,8,9};
static int count=0;
public static void main(String[] args){
    f(0);//进入递归
    System.out.println(count);
}
public static void f(int k){
//注意D和E。如果按题目中公式计算的话存在除法,有除法就会存在小数,有小数就会有误差。
//所以将公式转换为乘法,可以排除出现误差的可能
    if(k>=9){//返回条件
        int A=a[0];
        int B=a[1];
        int C=a[2];
        int D=a[3]*100+a[4]*10+a[5];
        int E=a[6]*100+a[7]*10+a[8];
        if(B*E + C*D == (10 - A) * C * E)count++;//满足条件则计数+1
    }
    for(int i=k;i<9;i++)//全排列
    {
     swap(i,k);//交换
     f(k+1);
     swap(i,k);//还原
    }
}
public static void swap(int i,int k){
    int t=a[i];
    a[i]=a[k];
    a[k]=t;
}

递归本来就很难理解,如果还是有什么不太懂的,像我一样把递归画一遍,这样能更好理解递归原理。

猜你喜欢

转载自blog.csdn.net/weixin_61936651/article/details/129777264
今日推荐