思路
这道题不难发现暴搜是可以的,因为时间限制为
5
5
5 秒。
而我们可以想到,这
3
3
3 个字符串中,最多只能用 10 个字母,
否则无论怎么放都会放重。
我们使用全排列来枚举每个字母对应的数字,最后求出看是否
N
1
+
N
2
=
N
3
N_1+N_2=N_3
N1+N2=N3 。
AC代码
#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
string s1,s2,s3;
map<char,int>num;
map<char,bool>vis;
vector<char>c;
map<int,int>us;
char path[100];
bool f;
void dfs(int x,int n) {
if(f)return ;
if(x==n) {
bool r=0;
int t1=0,t2=0,t3=0;
for(int i=0; i<s1.length(); i++) {
t1=t1*10+num[s1[i]];
if(i==0&&num[s1[i]]==0) {
r=1;
break;
}
}
for(int i=0; i<s2.length(); i++) {
t2=t2*10+num[s2[i]];
if(i==0&&num[s2[i]]==0) {
r=1;
break;
}
}
for(int i=0; i<s3.length(); i++) {
t3=t3*10+num[s3[i]];
if(i==0&&num[s3[i]]==0) {//去掉前导0
r=1;
break;
}
}
if(r){
return ;
}
//cout<<t1<<" "<<t2<<" "<<t3<<endl;
if(t1+t2==t3&&t1!=0&&t2!=0) {
f=1;
cout<<t1<<endl<<t2<<endl<<t3<<endl;
return ;
}
return ;
}
for(int i=0; i<=9; i++) {//枚举
if(us[i]==0) {//防止不同字母数字相同
us[i]=1;
num[c[x]]=i;
dfs(x+1,n);
us[i]=0;
}
}
}
signed main() {
IOS;
cin>>s1>>s2>>s3;
for(int i=0; i<s1.length(); i++) {
if(vis[s1[i]]==0) {
vis[s1[i]]=1;
c.push_back(s1[i]);
}
}
for(int i=0; i<s2.length(); i++) {
if(vis[s2[i]]==0) {
vis[s2[i]]=1;
c.push_back(s2[i]);
}
}
for(int i=0; i<s3.length(); i++) {
if(vis[s3[i]]==0) {
vis[s3[i]]=1;
c.push_back(s3[i]);
}
}//数字母有多少
if(c.size()>10) {//超过10
cout<<"UNSOLVABLE"<<endl;
return 0;
}
//cout<<c.size()<<endl;
dfs(0,c.size());
// for(int i=0;i<c.size();i++){
// cout<<c[i]<<" ";
// }
// cout<<endl;
//
if(!f) {
cout<<"UNSOLVABLE"<<endl;
}
return 0;
}