暴力搜索。注意题目说每个字母对应的数字不同,这句话表明最多只有10个字母,所以暴力DFS绝对不会TLE。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; char s[1000],t[1000]; char cun[1000]; int C[1000]; int ans[1000]; int tot; int flag; int rt[15]; void DFS(int x) { int i; if(x==tot) { t[0]=‘\0‘; strcpy(t,s); for(i=0;t[i];i++) if(t[i]>=‘A‘&&t[i]<=‘Z‘) t[i]=ans[C[t[i]]]+‘0‘; int num1=0; int num2=0; int num3=0; int num=0; int jia=0; int jian=0; for(i=0;t[i];i++) { if(t[i]>=‘0‘&&t[i]<=‘9‘) num=num*10+t[i]-‘0‘; if(t[i]==‘+‘) num1=num,num=0,jia=1; if(t[i]==‘-‘) num1=num,num=0,jian=1; if(t[i]==‘=‘) num2=num,num=0; } num3=num,num=0; if(jia==1) if(num1+num2==num3) flag=1; if(jian==1) if(num1-num2==num3) flag=1; return; } for(i=0;i<=9;i++) { if(rt[i]==0) { ans[x]=i; rt[i]=1; DFS(x+1); if(flag) return; rt[i]=0; } } } int main() { int i; while(~scanf("%s",s)) { memset(C,0,sizeof(C)); tot=1;flag=0; for(i=0;s[i];i++) { if(s[i]>=‘A‘&&s[i]<=‘Z‘) { if(C[s[i]]==0) { C[s[i]]=tot; cun[tot]=s[i]; tot++; } } } memset(rt,0,sizeof(rt)); DFS(1); int flag[1000]; int shuzi[1000]; memset(flag,0,sizeof(flag)); for(i=1;i<tot;i++) { flag[cun[i]]=1; shuzi[cun[i]]=ans[i]; } for(i=‘A‘;i<=‘Z‘;i++) if(flag[i]) printf("%c %d\n",i,shuzi[i]); } return 0; }
时间: 2024-10-12 18:49:41