ZOJ 1094_Matrix Chain Multiplication

来源:互联网 发布:vue服务端渲染java 编辑:程序博客网 时间:2024/05/29 02:51

大意:输入一系列矩阵(不超过26个),判断下面输入的矩阵乘法是否合法(即是否满足前者的列等于后者的行),若合法则输出其做了多次数的乘法运算(若有两矩阵A:a,b; B: b,c ,则其做的数乘法次数为a*b*c),若不合法,则输出error。

 

分析:为了操作方便定义一个矩阵结构,保存矩阵名,row和column. 从题意可知,每次的乘法都用括号隔开,那么这里就符合LIFO。前括号可以忽略,后括号作为每次乘法运算的标识。遇到矩阵即压栈。

 

#include<iostream>#include<stack>#include<string>using namespace std;struct Matrix//定义矩阵元素 {char name;int row;int column;};int main(){stack<Matrix> sk;int i,n,j,result;Matrix M[26],a,b,temp;string s;//保存每一组输入 bool flag;//error标识 while(cin>>n){for(i=0;i<n;i++)cin>>M[i].name>>M[i].row>>M[i].column;while(cin>>s){result=0;i=0;flag=true;while(s[i]!='\0'){if(s[i]!='(')//过滤'(' {if(s[i]>='A'&&s[i]<='Z')//遇到字母即在已知的矩阵数组中匹配 {for(j=0;j<n;j++){if(M[j].name==s[i]){sk.push(M[j]);//压栈 break;}}}else{if(s[i]==')')//')'为乘法标识 {b=sk.top();sk.pop();a=sk.top();sk.pop();if(a.column==b.row)//符合矩阵乘法法则 {temp.name='M';temp.row=a.row;temp.column=b.column;sk.push(temp);//将结果压栈 result+=a.row*a.column*b.column;//累计乘法次数 }else//不符合即error并标识不输出result {cout<<"error"<<endl;flag=false;break;}}}}i++;}while(!sk.empty())//清空栈 sk.pop();if(flag)cout<<result<<endl;}}return 0;}


 

原创粉丝点击