题目链接http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1094
//题目没搞懂-_-# 原来两个expression的时候必须要有括号,说白了就是单个矩阵的时候没有括号,其他情况一定都打了括号 //利用递归函数expression进入每一个括号内,每一个括号内一定又包含两个expression //举个例子 ( A ( BA ) ) ( ( AB ) A ) ()//不存在这样的情况,也就是说,左括号右边要么是左括号,要么是大写字母 //分别递归进入这两个exp,如果是单个矩阵,则返回0和它的row和col(为了给它外面的exp计算),如果又是一个exp,则递归进入,并且返回乘法运算次数和结果的row和col //其实就相当于返回一个 matrix结构,而这个结构是expression乘法的结果 //如果乘法不符合条件,则error=1 #include<iostream> using namespace std; int n; struct matrix{ int mult,row,col; }; char str[100]; bool error; int row[26],col[26]; int pos;// 注意pos一定要是公有变量 //exp的定义是,单个矩阵A 或者带括号的(exp1 exp2) //进入exp,pos为exp的第一个字符,如果这个字符是'('则递归进入exp1和exp2,如果pos是单个矩阵,则返回 matrix expression(){//在运行完函数体后,pos会转移到右括号处 matrix t; if(str[pos] =='('){//如果是左括号 matrix t1,t2; pos++; t1=expression(); t2=expression(); pos++; if(error||t1.col!=t2.row) error=1; else//如果乘法是合法的 { t.row=t1.row; t.col=t2.col; t.mult=t1.row*t1.col*t2.col+t1.mult+t2.mult; } } else{//如果是单个矩阵 t.row=row[str[pos]-'A']; t.col=col[str[pos]-'A']; t.mult=0; pos++; } return t; } int main(){ matrix total; cin>>n; char matname; for(int i=0;i<n;i++) { cin>>matname; cin>>row[matname-'A']>>col[matname-'A']; } getchar();//就因为这个卡了好久 while(gets(str)){ pos=error=0; total=expression(); if(error) cout<<"error "; else cout<<total.mult<<endl; } return 0; }