算法之矩阵运算
分析和思路:建立矩阵和输入字符的映射关系后,对表达式进行计算
1 // MatrixCalculate.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "string" 5 #include "map" 6 #include "iostream" 7 using namespace std; 8 9 #if 0 10 int main() 11 { 12 13 pair<int,int> p1(50,50); 14 map<string,pair<int,int>> m; 15 16 m["A"]=p1; 17 cout<<m["A"].first; 18 19 return 0; 20 } 21 #endif 22 23 //解题思路: 24 //遍历从起始位置遍历字符串,遇到(字符就入栈,遇到)要出栈了,并且进行计算,直到字符串为空结束 25 //还需要和输入的计算法则建立映射关系。 26 #include "iostream" 27 #include "string" 28 #include "vector" 29 #include "map" 30 #include "stack" 31 using namespace std; 32 int result=0; 33 pair<int,int> backResult(0,0); 34 void docal(stack<pair<int,int>> &st,stack<char> &so,map<char,pair<int,int>> &m){ 35 pair<int,int> p1; 36 pair<int,int> p2; 37 p2=st.top(); 38 st.pop(); 39 p1=st.top(); 40 st.pop(); 41 result+=p1.first*p2.second*p1.second; 42 backResult.first=p1.first; 43 backResult.second=p2.second; 44 st.push(backResult); 45 so.pop(); 46 } 47 48 int main() 49 { 50 int matrix_number=0; 51 while(cin>>matrix_number){ 52 pair<int,int> p1; 53 vector<pair<int,int>> v; 54 for(int i=0;i<matrix_number;i++){ 55 int row=0; 56 int col=0; 57 cin>>row>>col; 58 p1.first=row; 59 p1.second=col; 60 v.push_back(p1); 61 } 62 string input; 63 cin>>input; 64 map<char,pair<int,int>> m; 65 int index=0; 66 for(int i=0;i<input.size();i++){ 67 if((input[i]=='(')||(input[i]==')')){ 68 continue; 69 } 70 m[input[i]]=v[index++]; 71 } 72 stack<pair<int,int>> st; 73 stack<char> so; 74 for(int i=0;i<input.size();i++){ 75 if(input[i]!=')'||(input[i]>='A'&&input[i]<='Z')){ 76 pair<int,int> temp(0,0); 77 if(input[i]>='A'&&input[i]<='Z') 78 { 79 pair<int,int> temp=m[input[i]]; 80 st.push(temp); 81 } 82 if(input[i]=='(') 83 so.push(input[i]);//改变思路:鉴于在(AB)C与A(BC)的时候,会引起backResult的计算混乱,所以 84 //so保存pair结构可以解决这个问题 85 continue; 86 } 87 // while(!so.empty()&&so.top()!='(') 88 if(st.size()>=2&&!so.empty()){ 89 docal(st,so,m); 90 } 91 } 92 cout<<result<<endl; 93 result=0;} 94 }
别人的代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() { 4 int n; //矩阵的个数n 5 while(cin>>n) { 6 vector<pair<int, int>> matrix; //存放每个矩阵的行数和列数 7 for(int i=0;i<n;i++) { //依次输入n个矩阵的行数和列数,并保存在容器matrix中 8 int row,arrange; 9 cin>>row>>arrange; 10 matrix.push_back(make_pair(row, arrange)); 11 } 12 string rule; //存放计算的法则 13 cin>>rule; //输入法则rule 14 stack<char> sign; //符号栈 15 stack<pair<int, int>> Stack_matrix; //矩阵栈 16 int count=0; //乘法次数 17 for(int i=0;i<rule.length();i++) { //按照计算法则求矩阵的乘法次数 18 if(rule[i]=='(') { //'('为待匹配的符号,压入符号栈中 19 sign.push(rule[i]); 20 }else if(rule[i]>='A' && rule[i]<='Z') { //如果为字母,将该字母对应的矩阵添加到矩阵栈中 21 Stack_matrix.push(matrix[rule[i]-'A']); 22 }else if(rule[i]==')') { //如果当前符号为')',将符号栈中的'('出栈 23 sign.pop(); 24 pair<int, int> matrix2 = Stack_matrix.top(); //依次弹出矩阵栈的两个栈顶矩阵 25 Stack_matrix.pop(); 26 pair<int, int> matrix1 = Stack_matrix.top(); 27 Stack_matrix.pop(); 28 count += matrix1.first*matrix1.second*matrix2.second; //累加乘法次数 29 Stack_matrix.push(make_pair(matrix1.first, matrix2.second)); //将矩阵相乘的结果重新压入栈中 30 } 31 } 32 cout<<count<<endl; //输出矩阵相乘的乘法总次数 33 } 34 return 0; 35 }
主要为了自己学习