蓝桥杯 - 三羊献瑞 (java实现)

观察下面的加法算式:

       祥 瑞 生 辉
  +   三 羊 献 瑞
-------------------------
  三  羊 生 瑞 气

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

代码:

/**
 * 蓝桥杯: 三羊献瑞
 * @author 只爱吃土豆
 *
 */
public class TestDemo4 {
	public static void main(String[] args) {
		//创建一个数组,用来表示  三 羊 献 瑞 祥 生 辉 气
		int[] arr = new int[8];
		
		dfs(arr,0);
	}

	private static void dfs(int[] a, int n) {
		//说明 a 数组 中的所有数都找完了
		if(n == 8) {
			//判断当前数组中的数是不是满足要求
			if(checkArray(a) == true) {
				//找到了合适的数,就将  三 羊 献 瑞  所对应的数字打印出来
				System.out.println(a[0]+""+a[1]+a[2]+a[3]);
			}
		}else {
			//说明还没有找满 8 个数
			for(int i = 0; i < 10; i++) {
				//每个位上的数字范围:0-9
				a[n] = i;   //将数字复制到当前 n 所指的位置
				//检查一下当前所填数字是否满足要求: a[0] 只能是 1,a数组中的数字不能重复
				if(check(a,n) == true) {
					//递归后一位数字
					dfs(a,n+1);
				}
			}
		}
	}

	/**
	 * 检查是否符合 题目要求: a[0] == 1, a数组中的数字不能出现重复
	 * @param a  存放  三 羊 献 瑞 祥 生 辉 气 的数组
	 * @param n  当前第几位
	 * @return   返回检查结果
	 */
	private static boolean check(int[] a, int n) {
		//如果 当前 是第一位数字
		if(n == 0) {
			//判断一下是不是 1
			if(a[n] != 1) {
				//告诉 dfs 方法 不用往下递归了
				return false;
			}
		}else {
			//不是第一位,就要检查 当前 赋的值 在前面出现过没有
			for(int i = 0; i < n; i++) {
				if(a[i] == a[n]) {
					//也不用递归下去了
					return false;
				}
			}
		}
		//符合条件,返回一个true,进行下一位的查找
		return true;
	}

	/**
	 * 检查 当前 所 找到的一组数 能不能满足 题目要求
	 * @param a  一个数组
	 * @return   true 或 false
	 */
	private static boolean checkArray(int[] a) {
		int x = a[0]*1000+a[1]*100+a[2]*10+a[3];            // 三羊献瑞
		int y = a[4]*1000+a[3]*100+a[5]*10+a[6];            //祥瑞生辉
		int w = a[0]*10000+a[1]*1000+a[5]*100+a[3]*10+a[7]; //三羊生瑞气
		if(x+y == w) {
			return true;
		}
		return false;
	}
}

结果:1085

你可能感兴趣的:(蓝桥杯,蓝桥杯,算法,数据结构,java)