UVALive - 5107 - A hard Aoshu Problem
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVALive - 5107 - A hard Aoshu Problem相关的知识,希望对你有一定的参考价值。
题目链接:https://vjudge.net/problem/UVALive-5107
题目大意:用ABCDE代表不同的数字,给出形如ABBDE___ABCCC = BDBDE的东西;
空格里面可以填入+-*/的运算符,给字母赋予不同的值,问有多少种情况使得
等式成立。
题目分析:
可以直接用大模拟+暴力求解,注意对于重复情况的判重。
给出代码:
1 #include <iostream> 2 #include <set> 3 #include <algorithm> 4 #include <cstring> 5 #include <string> 6 using namespace std; 7 string a; 8 string b; 9 string c; 10 set<int> mark; 11 set<int> marks; 12 int num[30]; 13 int main() 14 { 15 int N; 16 cin>>N; 17 while(N--) 18 { 19 cin>>a>>b>>c; 20 marks.clear(); 21 int t1=a.length(); 22 int t2=b.length(); 23 int t3=c.length(); 24 for(int i=0; i<t1; i++) 25 { 26 int t=a[i]-‘A‘; 27 marks.insert(t); 28 } 29 for(int i=0; i<t2; i++) 30 { 31 int t=b[i]-‘A‘; 32 marks.insert(t); 33 } 34 for(int i=0; i<t3; i++) 35 { 36 int t=c[i]-‘A‘; 37 marks.insert(t); 38 } 39 mark.clear(); 40 // marks.clear(); 41 int cnt=0; 42 for(int i=0; i<=9; i++) 43 { 44 for(int j=0; j<=9; j++) 45 { 46 if(i==j) 47 continue; 48 for(int k=0; k<=9; k++) 49 { 50 if(k==i||k==j) 51 continue; 52 for(int m=0; m<=9; m++) 53 { 54 if(m==i||m==j||m==k) 55 continue; 56 for(int n=0; n<=9; n++) 57 { 58 if(n==i||n==j||n==m||n==k||n==m) 59 continue; 60 int ttt=marks.size(); 61 //int sum=0; 62 int ans=0; 63 for(int y=0;y<ttt;y++) 64 { 65 if(y==0) 66 ans=ans*10+i; 67 if(y==1) 68 ans=ans*10+j; 69 if(y==2) 70 ans=ans*10+k; 71 if(y==3) 72 ans=ans*10+m; 73 if(y==4) 74 ans=ans*10+n; 75 } 76 if(mark.count(ans)==1) 77 continue; 78 mark.insert(ans); 79 set<int>::iterator ite=marks.begin(); 80 for(int ans=0; ite!=marks.end(); ite++,ans++) 81 { 82 int t=*ite; 83 if(ans==0) 84 num[t]=i; 85 if(ans==1) 86 num[t]=j; 87 if(ans==2) 88 num[t]=k; 89 if(ans==3) 90 num[t]=m; 91 if(ans==4) 92 num[t]=n; 93 } 94 int flag=a[0]-‘A‘; 95 if(num[flag]==0&&t1>1) 96 continue; 97 flag=b[0]-‘A‘; 98 if(num[flag]==0&&t2>1) 99 continue; 100 flag=c[0]-‘A‘; 101 if(num[flag]==0&&t3>1) 102 continue; 103 long long int num1=0,num2=0,num3=0; 104 for(int i=0; i<t1; i++) 105 { 106 int tt=a[i]-‘A‘; 107 num1=num1*10+num[tt]; 108 } 109 for(int i=0; i<t2; i++) 110 { 111 int tt=b[i]-‘A‘; 112 num2=num2*10+num[tt]; 113 } 114 for(int i=0; i<t3; i++) 115 { 116 int tt=c[i]-‘A‘; 117 num3=num3*10+num[tt]; 118 } 119 if(num1+num2==num3) 120 cnt++; 121 if(num1-num2==num3) 122 cnt++; 123 if(num1*num2==num3) 124 cnt++; 125 if(num2!=0&&num1/num2==num3&&num1%num2==0) 126 cnt++; 127 } 128 } 129 } 130 } 131 } 132 cout<<cnt<<endl; 133 } 134 return 0; 135 }
以上是关于UVALive - 5107 - A hard Aoshu Problem的主要内容,如果未能解决你的问题,请参考以下文章
[2016-03-05][UVALive][4104][MODEX]
UVALive 4223 / HDU 2962 spfa + 二分
UVALive 3989 Ladies' Choice