题目意思:给定一序列的矩阵,然后对于每一个表达式求出矩阵的乘法次数
解题思路:我们可以想到利用栈的思想,如果读入的字符不是 ')' 那么我们都把它如栈,如果遇到')', 我们往回找到第一个不是左括号后面的所有矩阵然后相乘,在把结果如栈即可
注意事项:由于后面的乘法会改变值,所以我们必须开两个结构体,一个用来存放初始值,另外一个是作为计算是所用,这样就不会有错,还有这一题数据很水,如果直接考虑括号内只有两个矩阵也可以过
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <stack> #include <algorithm> using namespace std; int n , sum; char ch[100]; //结构体用来存储行数和列数 struct Matrix{ int row; int col; }; Matrix s[200];//存储输入的值 Matrix cs[200];//如果不开两个会有数据出错 stack<char>st; //复制到另外一个结构体里面 void copy(){ for(int i = 1 ;i <= n ; i++) cs[i] = s[i]; } void solve(){ int i = 0 , mark = 0; sum = 0; copy(); while(ch[i]){ //如果不是有括号就入栈 if(ch[i] != ')') st.push(ch[i]); else{ //建立一个临时的栈用来存储要计算的那一部分 stack<char>temp; while(!temp.empty()) temp.pop(); //第一个左括号之前全部入栈 while(st.top() != '('){ temp.push(st.top()); st.pop(); } st.pop();//同时删除一个左括号 //tempchar 表示第一个矩阵 char tempchar; if(!temp.empty()) tempchar = temp.top(); temp.pop(); //计算矩阵的乘法次数 while(!temp.empty()){ //如果两个矩阵不满足乘法就输出error if(cs[tempchar-64].col != cs[temp.top()-64].row){ printf("error\n"); mark = 1; break; } else{ //这里都要对cs结构体操作,因为乘法后会改变原来的值 sum += cs[tempchar-64].row * cs[tempchar-64].col * cs[temp.top()-64].col; cs[tempchar-64].col = cs[temp.top()-64].col; temp.pop(); } } if(mark) break; st.push(tempchar);//最后一个矩阵从新入栈 } i++; } if(!mark) cout<<sum<<endl; //栈的清空 while(!st.empty()) st.pop(); } //main函数实现 int main(){ int i; char c; cin>>n; getchar(); for(i = 1 ; i <= n ; i++){ cin>>c>>s[i].row>>s[i].col; } getchar(); while(gets(ch)){ //只有一个矩阵就直接输出error if(strlen(ch) == 1) cout<<0<<endl; else solve(); } return 0; }
时间: 2024-09-22 01:22:14