- 定位:2015年第六届蓝桥杯省赛C/C++ B组试题C
- 原题:三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-------------------
三 羊 生 瑞 气
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
- 属性:枚举
- 难度:破壳
- 独白:
第一眼看到这题的时候,我蒙了,这是啥子玩意???
我们冷静分析发现,这里使用汉字序列相加得到新的汉字序列就是在唬人,我们不要被汉字相加这样的陌生形式所吓倒,我们可以转化一下,将汉字转化为字母,这样就会好很多了。转化为字母时,我们得到了这样的一组加法算式(这里我们依次对汉字附上字母表示,a~h):
e d g f
+ a b c d
-------------------
a b g d h
在得到这样一组加法算式后,我们就可以看清这题的本质了,其实就是循环枚举每位上的数字就可以得到答案的,依据题目我们来进行模拟,将模拟表达式(即这一组字母加法算式)代入循环判断条件,然后满足每个字母所代表的数字不相同就可以了,当然这里a和e可以直接判断不可能为0,即从1开始枚举就可以了。(1085)
- 代码:
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
for(int a=1;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=1;e<=9;e++){
for(int f=0;f<=9;f++){
for(int g=0;g<=9;g++){
for(int h=0;h<=9;h++){
if(((e*1000+d*100+g*10+f)+(a*1000+b*100+c*10+d)==(a*10000+b*1000+g*100+d*10+h))&&!(a==b||a==c||a==d||a==e||a==f||a==g||a==h||b==c||b==d||b==e||b==f||b==g||b==h||c==d||c==f||c==e||c==f||c==g||c==h||d==e||d==f||d==g||d==h||e==f||e==g||e==h||f==g||f==h||g==h)){
cout<<a<<b<<c<<d<<endl;
cout<<e<<d<<g<<f<<endl;
cout<<a<<b<<g<<d<<h;
return 0;
}
}
}
}
}
}
}
}
}
}
- 总结:转化问题的表观模型,将问题本质化为我们所熟悉的模型。
- 感悟:不可一叶障目,要看得见眼前的树叶,更要看得见远方的森林。
- 归档:已归档。