三羊獻瑞,藍橋杯2015年第3題
阿新 • • 發佈:2019-01-31
3. 三羊獻瑞
觀察下面的加法算式:
祥 瑞 生 輝
+ 三 羊 獻 瑞
-------------------
三 羊 生 瑞 氣
觀察下面的加法算式:
祥 瑞 生 輝
+ 三 羊 獻 瑞
-------------------
三 羊 生 瑞 氣
(如果有對齊問題,可以參看【圖1.jpg】)其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。
最笨的窮舉法:
/* 因為是加法,所以易得“三”為1 因為“三”+“祥”要有進位,所以“祥”為8或9,此時可以看出羊只能是0 此時“羊”+“瑞”最大為後一位進一個加9,而“羊”為0,所以“生”不可能為0,所以百位不能生成進位,得到“祥”為9 */ #include<stdio.h> int main() { int a,b,c,d,e,x1,x2; for(a=2;a<=8;a++) { for(b=2;b<=8;b++) { if(b==a+1) { for(c=2;c<=8;c++) { if(c!=a&&c!=b) { for(d=2;d<=8;d++) { if(d!=a&&d!=b&&d!=c&&(b+d>=10)) { for(e=2;e<=8;e++) { if(e!=a&&e!=b&&e!=c&&e!=d) { x1=(9*1000+a*100+b*10+c)+(1000+d*10+a); x2=1*10000+b*100+a*10+e; if(x1==x2) { printf("10%d%d\n",d,a); } } } } } } } } } } return 0; }
遞迴實現的dfs+回溯方法:
/* 祥5 瑞3 生2 輝6 + 三0 羊1 獻7 瑞3 ------------------- 三0 羊1 生2 瑞3 氣4 */ #include<iostream> using namespace std; int visit[10],a[8]; void dfs(int step) { if(step>7) { int b=a[5]*1000+a[3]*100+a[2]*10+a[6]; int c=a[0]*1000+a[1]*100+a[7]*10+a[3]; int d=a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4]; if(b+c==d) { cout<<a[0]<<" "<<a[1]<<" "<<a[7]<<" "<<a[3]<<endl; } return; } for(int j=0;j<=9;j++) { if(step==0&&j!=1)//剪枝在for迴圈裡面剪 { continue;//結束單次迴圈 } if(visit[j]==0) { visit[j]=1; a[step]=j; dfs(step+1); visit[j]=0; } } return; } int main() { dfs(0); return 0; }