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; }
相关文章推荐
- Mysqli:预编译 mysqli_stmt
- java连接MongoDB数据库
- POJ 2062 HDU 1528 ZOJ 2223 Card Game Cheater
- C语言缺陷与陷阱(3)
- c++ 复杂类型指针 类指针 浅谈
- 我对编程的认识
- c#开发宝典王小科 李继业著 1.3.7 “输出”面板
- 八皇后问题
- ZOJ 1967 POJ 2570 Fiber Network
- HDU 1969 Pie
- 查看Linux服务器的所占用的IP地址
- SQL 获取连接客户端IP地址
- poj3018(欧拉路)
- PHP中的include和require
- Spring IOC源码详解之容器初始化
- 算法情缘
- 继承与派生
- 算法情缘
- Android源码编译apk导入第三方包报错
- JSTL简介