您的位置:首页 > 其它

POJ 3548 Restoring the digits

2015-07-26 09:00 267 查看
暴力搜索。注意题目说每个字母对应的数字不同,这句话表明最多只有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: