蓝桥杯 凑算式的java实现

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

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?

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

算法思想:将A-I所代表的数字进行全排列,然后进行检查看看是否符合等式。

数据域:

1.private static int[] visited;

主要是用来表示数据是否被访问过(0表示数据尚未被访问过,1表示数据已经被访问过了)。

2.private static double[] save;

用来存储数据。

3.private static int sum;
   用来计数,统计符合该等式的情况数。

方法:

1.数据的初始化

private static void init() {
        visited=new int[9];
        for(int i=0;i<9;i++) {
            visited[i]=0;//0表示尚未被访问,1表示已经被访问过了
        }
        save=new double[9];
    }

2.检测是否满足等式

private static boolean check() {
        double def=save[3]*100+save[4]*10+save[5];
        double ghi=save[6]*100+save[7]*10+save[8];
        double left=save[0]+save[1]/save[2]+def/ghi;
        if(left==10) {
            return true;
        }
        return false;
    }

3.进行深度搜索

private static void dfs(int step) {
        if(step>8) {
            if(check()==true) {
                sum++;
            }
            return;//注意return不可写在if语句里面
        }
        
        else {
            for(int i=1;i<10;i++) {
                if(visited[i-1]==0) {//当前的数字没有被访问
                    save[step]=i;
                    visited[i-1]=1;//设置当前数字状态为已经被访问过了
                    dfs(step+1);
                    visited[i-1]=0;//回溯
                }
            }
        }
    }

注意:保存数据的元素类型应该是double型,而不应该是int型。

答案:29

猜你喜欢

转载自blog.csdn.net/just16cz/article/details/84189604