模拟矩阵相乘,感觉表达式计算基本是用栈吧,题目不难,但我WA两次,因为没有注意括号内必定有两个矩阵且矩阵相乘我搞成只要a.x==b.y||a.y==b.x就可以相乘,实际上是不允许调换位置的,tmd把简单程序写复杂了
注意scanf("%c")与getline要尤为注意换行符
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 typedef pair<int,int> pii; 5 unordered_map<char,pair<int,int> > um; 6 //一个括号只能扩两个表达式 7 int main()//矩阵相乘 AB只能是A的列=B的行,不允许换位置 8 { 9 // freopen("in.txt","r",stdin); 10 // freopen("out.txt","w",stdout); 11 int n; 12 scanf("%d",&n); 13 // getchar();//getline与scanf("%c")的三省吾身 14 for(int i=1;i<=n;i++){ 15 char c; int x,y; 16 cin>>c>>x>>y; 17 pii p; p.first = x; p.second = y; 18 um[c] = p; 19 } 20 string str; 21 while(cin>>str){ 22 bool isover = false; 23 ll sum = 0; 24 // printf("%s\n",str.c_str()); 25 stack<pii> s; 26 for(int i=0;i<str.size();i++){ 27 if(isalpha(str[i])) s.push(um[str[i]]); 28 else if(str[i]==')'){ 29 pii a = s.top(); s.pop(); 30 pii b = s.top(); s.pop(); 31 if(a.first!= b.second){ 32 isover = true; 33 printf("error\n"); break; 34 }else if(a.first==b.second){ 35 sum+=b.first*a.second*b.second; 36 pii now; now.first = b.first; now.second = a.second; 37 s.push(now); 38 } 39 } 40 } 41 if(!isover) printf("%lld\n",sum); 42 } 43 return 0; 44 } 45