第六屆藍橋杯大賽省賽真題-填空題-三羊獻瑞(Java實現)
阿新 • • 發佈:2021-01-26
三羊獻瑞
觀察下面的加法算式:
祥 瑞 生 輝
+ 三 羊 獻 瑞
-------------------
三 羊 生 瑞 氣
(如果有對齊問題,可以參看【圖1.jpg】)
其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。
請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。
【解析】
這是一道無重複的組合並排序的題目!!!
解決方法:一種是暴力列舉,另一種是遞歸回溯
填空題直接用暴力列舉就行了,這題和第四屆藍橋杯省賽真題-填空題-馬虎的算式(Java實現)是一樣的題型
方法一:暴力列舉
package 第六屆省賽;
public class _3三羊獻瑞 {
public static void main(String[] args) {
for(int a=0;a<=9;a++) {
for(int b=0;b<=9;b++) {
for(int c=0;c<=9;c++) {
for(int d=0;d<=9;d++) {
for(int e=0;e<=9;e++) {
for(int f=0;f<=9;f++) {
for(int g=0;g<=9;g++) {
for (int i=0;i<=9;i++) {
if(b!=a&&c!=b&&c!=a&&
d!=c&&d!=b&&d!=a&&
e!=d&&e!=c&&e!=b&&e!=a&&
f!=e&&f!=d&&f!=c&&f!=b&&f!=a&&
g!= f&&g!=e&&g!=d&&g!=c&&g!=b&&g!=a&&
i!=g&&i!=f&&i!=e&&i!=d&&i!=c&&i!=b&&i!=a) {
int x = a*1000+b*100+c*10+d;
int y = e*1000+f*100+g*10+b;
int z = e*10000+f*1000+c*100+b*10+i;
if(x+y==z) {
if(y/1000>0) //取四位的數字
System.out.println(y);
}
}
}
}
}
}
}
}
}
}
}
}
方法二:遞歸回溯
package 第六屆省賽;
/**
* 遞歸回溯
* @author wzc
* @date 2021年1月24日
*/
public class _3三羊獻瑞2 {
public static void main(String[] args) {
int a[] = new int[8];//abcdefgh一共8個未知數
int[] b = new int[10]; //從b裡取數0-9
for(int i=0; i<b.length; i++) {//填充b陣列
b[i] = i;
}
//呼叫f()
f(a,b,0);
}
private static void f(int[] a, int[] b, int i) {
//結束條件
if(i==a.length) {
int x = a[0]*1000+a[1]*100+a[2]*10+a[3];
int y = a[4]*1000+a[5]*100+a[6]*10+a[1];
int z = a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];
if(x+y==z) {
if(y/1000>0)
System.out.println(y);
}
return;
}
for(int j=0; j<b.length; j++) {
if(b[j]!=-1) {
a[i] = b[j]; //取數放進容器a裡
b[j]=-1; //已使用,標記-1
f(a,b,i+1);
b[j] = a[i]; //呼叫結束了,把容器a裡的數還回去
}
}
}
}
結果
1085