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 }
View Code

 

以上是关于UVALive - 5107 - A hard Aoshu Problem的主要内容,如果未能解决你的问题,请参考以下文章

[2016-03-05][UVALive][4104][MODEX]

UVALive 4223 / HDU 2962 spfa + 二分

UVALive 3989 Ladies&#39; Choice

UVALive - 5095Transportation(费用流)

UVALive 5741 Wealthy Family

[2016-03-19][UVALive][3971][Assemble]