POJ 3989 A hard Aoshu Problem

题目连接:http://poj.org/problem?id=3989

题意:给3个字符串,求每个字母匹配一个数字之后成立的等式的个数。S2,S3之间为等号,S1,S2之间可为任意运算符号(+,-,*,/)。

分析:一开是给想复杂了...结果一看范围我崩溃,爆搜秒之。

 

附代码:

View Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
bool v[6];
bool visit[10];
int t[6];
int a[6],b[6],c[6];
int lena,lenb,lenc;
int ans;
int check()
{
int x=0,y=0,z=0,tans=0;
if (lena>0 && t[a[0]]==0) return 0;
if (lenb>0 && t[b[0]]==0)return 0;
if (lenc>0 && t[c[0]]==0) return 0;
for (int i=0;i<=lena;i++)
x=x*10+t[a[i]];
for (int i=0;i<=lenb;i++)
y=y*10+t[b[i]];
for (int i=0;i<=lenc;i++)
z=z*10+t[c[i]];
if (x+y==z) tans++;
if (x-y==z) tans++;
if (x*y==z) tans++;
if (y!=0) if (x/y==z && x%y==0) tans++;
return tans;
}
void dfs(int d)
{
if (d==5)
{
ans+=check();
return;
}
if (v[d])
for (int i=0;i<=9;i++)
{
if (!visit[i])
{
visit[i]=true;
t[d]=i;
dfs(d+1);
visit[i]=false;
}
} else dfs(d+1);
}
void init()
{
char str[10];
ans=0;
memset(v,false,sizeof(b));
memset(visit,false,sizeof(visit));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",str);
for (int i=0;i<strlen(str);i++) {a[i]=str[i]-'A';v[a[i]]=true;lena=i;}
scanf("%s",str);
for (int i=0;i<strlen(str);i++) {b[i]=str[i]-'A';v[b[i]]=true;lenb=i;}
scanf("%s",str);
for (int i=0;i<strlen(str);i++) {c[i]=str[i]-'A';v[c[i]]=true;lenc=i;}
dfs(0);
printf("%d\n",ans);
}
int main()
{
freopen("1.in","r",stdin);
freopen("out","w",stdout);
int Case;
scanf("%d",&Case);
while (Case--) init();
return 0;
}

 

后记:以后一定要注意先观察数据范围再做思考...

转载于:https://www.cnblogs.com/evan-oi/archive/2012/02/22/2362581.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值