蓝桥杯2015年第十三届省赛真题-三羊献瑞

一、题目

观察下面的加法算式:

祥 瑞 生 辉

  • 三 羊 献 瑞

三 羊 生 瑞 气

(如果有对齐问题,可以参看【图1】)

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

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

二、分析

问的是三羊献瑞所代表的4位数字,那么我们可以看见这里总共有8个汉字,那么每个汉字都有可能是0~9这10个数字,但是祥和三不能为0,所以我们可以以深度优先算法进行全排列,找出符合条件的数字。


这里先给出一个深度优先算法进行全排列的小例题:

我们设数字是 {1 2 3 4 },那么递归求全排列

要求 全排列 我们的总体思想是:先将数字存到数组里面,将当前的元素与后面的元素进行交换,然后递归地处理剩下的元素,直到递归到最后一个元素,输出当前的序列,我们再回溯到上一层,继续进行递归来搜索其他的序列。

代码:

java 复制代码
package dfs进行全排列;

import java.util.Arrays;

public class A {

	public static void main(String[] args) {
		dfs(0, arr.length-1);
		
	}
	
	public static int[] arr = {1,2,3,4};
	
	public static void dfs(int start, int end) {
		//退出的条件
		if(start == end) {
			System.out.println(Arrays.toString(arr));
			return;
		}
		
		//递归处理全排列
		for(int i = start; i <= end; i++) {
			swap(arr, start, i);//将当前的元素与后面的元素进行交换
			dfs(start+1, end);//递归地处理剩下的元素,直到递归到最后一个元素
			swap(arr, start, i);//回溯到上一层继续进行递归
		}
	}
	
	public static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}

结果:

1, 2, 3, 4

1, 2, 4, 3

1, 3, 2, 4

1, 3, 4, 2

1, 4, 3, 2

1, 4, 2, 3

2, 1, 3, 4

2, 1, 4, 3

2, 3, 1, 4

2, 3, 4, 1

2, 4, 3, 1

2, 4, 1, 3

3, 2, 1, 4

3, 2, 4, 1

3, 1, 2, 4

3, 1, 4, 2

3, 4, 1, 2

3, 4, 2, 1

4, 2, 3, 1

4, 2, 1, 3

4, 3, 2, 1

4, 3, 1, 2

4, 1, 3, 2

4, 1, 2, 3

Arrays.ToString(数组名);数组转换为字符串,用之前记得要导包import java.util.Arrays;

本题的代码

java 复制代码
package lan2015;

public class C三羊献瑞 {

	public static void main(String[] args) {
		dfs(0);
	}
	
	public static int[] arr = {0,1,2,3,4,5,6,7,8,9};
	
	public static void dfs(int m) {
		if(m >= 9) {
			int a = arr[0]*1000+ arr[1]*100 + arr[2]*10 + arr[3];
			int b = arr[4]*1000+ arr[5]*100 + arr[6]*10 + arr[1];
			int c = arr[4]*10000+ arr[5]*1000+ arr[2]*100 + arr[1]*10 + arr[7];
			if(arr[0]==0 || arr[4]==0) return;
			if(a+b == c) {
				System.out.println(arr[4]+" "+arr[5]+" "+arr[6]+" "+arr[1]);
			}
			return;
		}
		
		//递归搜索
		for(int i = m; i <= 9; i++) {
			swap(m, i);
			dfs(m+1);
			swap(m, i);
		}
	}
	
	public static void swap(int i , int j) {
		int t =arr[i];
		arr[i] = arr[j];
		arr[j] = t;
	}
}

执行结果:

1 0 8 5

1 0 8 5

相关推荐
闻缺陷则喜何志丹3 小时前
【C++贪心】P8769 [蓝桥杯 2021 国 C] 巧克力|普及+
c++·算法·蓝桥杯·洛谷
躬身入世,以生证道13 小时前
面试技术栈 —— 简历篇
面试·职场和发展
Asmalin14 小时前
【代码随想录day 35】 力扣 01背包问题 一维
算法·leetcode·职场和发展
Miraitowa_cheems1 天前
LeetCode算法日记 - Day 64: 岛屿的最大面积、被围绕的区域
java·算法·leetcode·决策树·职场和发展·深度优先·推荐算法
_不会dp不改名_1 天前
leetcode_1382 将二叉搜索树变平衡树
算法·leetcode·职场和发展
旭意1 天前
C++微基础备战蓝桥杯之数组篇10.1
开发语言·c++·蓝桥杯
墨染点香2 天前
LeetCode 刷题【103. 二叉树的锯齿形层序遍历、104. 二叉树的最大深度、105. 从前序与中序遍历序列构造二叉树】
算法·leetcode·职场和发展
旭意2 天前
C++微基础备战蓝桥杯string篇10.5
开发语言·c++·蓝桥杯
黑色的山岗在沉睡2 天前
LeetCode 2761. 和等于目标值的质数对
算法·leetcode·职场和发展
T1an-12 天前
力扣70.爬楼梯
算法·leetcode·职场和发展