【蓝桥杯省赛JavaB组真题详解】凑算式(2016)

题目描述

凑算式
【蓝桥杯省赛JavaB组真题详解】凑算式(2016)_第1张图片
这个算式中A ~ I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

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

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

解题思路

网上普遍采用暴力解法,大致思路是使用九层for循环,我这用的方法是递归算法
本题是分数运算,浮点数运算存在误差,可转换为整数运算,避免误差。即

	c*ghi*(10-a)==b*ghi+c*def

参考代码

public class Digui {
     

	static int count = 0;
	static int[] res=new int[9];
	static int[] v=new int[9];
	
	public static void main(String[] args) {
     
		dfs(0);
		System.out.println(count);
	}
	
	private static void dfs(int k) {
     
		if(k==9) {
     
			if(check())
				count++;
		}
		for (int i = 0; i < 9; i++) {
     
			if(v[i]==0){
     
				v[i] = 1;//标注该位置是否已填数字
				res[k] = i+1;
				dfs(k+1);
				v[i] = 0;//递归后清除
			}
		}
	}

	private static boolean check() {
     
		int a=res[0],b=res[1],c=res[2],
				def=res[3]*100+res[4]*10+res[5],
				ghi=res[6]*100+res[7]*10+res[8];
		if(c*ghi*(10-a)==b*ghi+c*def) {
     
			return true;
		}else {
     
			return false;
		}
	}
}

参考答案:29

你可能感兴趣的:(蓝桥杯JavaB组真题详解,算法,java,数据结构,蓝桥杯省赛真题)