一、题目
观察下面的加法算式:
祥 瑞 生 辉
- 三 羊 献 瑞
三 羊 生 瑞 气
(如果有对齐问题,可以参看【图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