第六屆藍橋杯java 三羊獻瑞
阿新 • • 發佈:2019-01-26
三羊獻瑞
觀察下面的加法算式:
祥 瑞 生 輝
+ 三 羊 獻 瑞
-------------------
三 羊 生 瑞 氣
其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。
請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。
思路分析:一共有8種不同的數字,現用字母表示為a~h,每個字母用0~9中的某個數字去填充,明顯,這裡有兩個字母是不可以為0的,這可以作為優化的一個條件。這裡運用回溯演算法的思想,一共需要填充8個數字,可以設一個長度為8的整形陣列a,設需要輸出的為a[0]~a[3]。從a[0]開始依次填充,每次符合條件繼續填充下一個。程式碼如下:
package 第六屆;
public class 三羊獻瑞 {
public static void main(String args[]){
int a[]=new int[8];
for(int i=0;i<8;i++){
a[i]=0;
}
fun(a,0);
}
public static void fun(int a[],int n){
if(n==8){
if(check_sum(a)){
System.out.println(a[0]+""+a[1]+""+a[2]+""+a[3]);
return;
}
}else{
for(int i=0;i<10;i++){
a[n]=i;
if(check(a,n)) fun(a,n+1);
}
}
}
public static boolean check(int a[],int n){
boolean flag=true;
if(n==0){
if(a[n]==0) flag=false;
}else{
for(int i=0;i<n;i++){
if(a[i]==a[n]){
flag=false;
break;
}
}
if(n==4 && a[n]==0) flag=false;
}
return flag;
}
public static boolean check_sum(int a[]){
int x=1000*a[4]+100*a[3]+10*a[5]+a[6];
int y=1000*a[0]+100*a[1]+10*a[2]+a[3];
int z=10000*a[0]+1000*a[1]+100*a[5]+10*a[3]+a[7];
if((x+y)==z){
return true;
}else{
return false;
}
}
}