您的位置:首页 > 其它

POJ 3989 A hard Aoshu problem (模拟)

2017-11-19 00:03 351 查看
题目地址
点击打开链接
dfs,模拟判断即可。 注意 S1%S2==0 和0开头的情况。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;

bool use[10];       //每个数字是否用过(用于枚举过程的判断)
ll n,num,ans;
ll que[10];         //枚举每个字母对应数字
map<char,int> exi;  //字母对应的数字
string y[3];        //s1 s2 s3

void judge(){
ll ny[3]={0},i,j;
for(j=0;j<3;j++){
for(i=0;i<y[j].size();i++){                 //把每个字符串对应的数求出
ny[j]+=que[exi[y[j][i]]];ny[j]*=10;
}
ny[j]/=10;
ll x=1;
for(i=0;i<y[j].size()-1;i++)x*=10;          //排除首字母对应0
if(x>ny[j] && y[j].size()>1)return;
}
if(ny[0]+ny[1]==ny[2])ans++;
if(ny[0]*ny[1]==ny[2])ans++;
if(ny[0]-ny[1]==ny[2])ans++;
if((ny[1]!=0) && (ny[0]%ny[1]==0) && (ny[0]/ny[1]==ny[2]))ans++;
}

void dfs(int x){
if(x==num+1){judge();return;}
for(int i=0;i<=9;i++)if(!use[i]){           //枚举数
que[x]=i;use[i]=1;dfs(x+1);use[i]=0;
}
}

void setexi(){
int i,j;
exi.clear();
for(i=0;i<=9;i++)use[i]=0;              //初始化
num=ans=0;

for(j=0;j<3;j++)
for(i=0;i<y[j].size();i++)
if(exi.find(y[j][i])==exi.end())    //判断出现了多少种字母,并与数字对应
exi[y[j][i]]=++num;
}

int main(){
cin>>n;
while(n--){
for(int i=0;i<3;i++)cin>>y[i];
setexi();
dfs(1);
cout<<ans<<endl;
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj