/*
简单的表达式求解,计算过程是求两个矩阵乘法运算过程中有多少次元乘法(两个数字相乘),可能出现两个矩阵无法相乘的情况输出error
*/
#include<stdio.h>
#include<string.h>
struct node//矩阵信息
{
char n;//矩阵的名称
int x,y,num;//矩阵的行数和列数以及得到这个矩阵前有多少次元乘法
}p[30];
char s[100];//存储表达式
int len;//表达式的长度
int n;
int findk(int i)
{
int you=1;
i++;
while(you)
{
while(s[i]!='('&&s[i]!=')')
i++;
if(s[i]=='(')
you++;
else you--;
i++;
}
return i-1;
}
node getnum(int i,int j)//求表达式的值,返回值是一个矩阵,其中包含得到这个矩阵所经过的元乘法次数
{
if(i==j)//若表达式是一个矩阵
{
int k=0;
node cur;
for(;k<n;k++)
{
if(p[k].n==s[i])//找到这个矩阵
{
cur.x=p[k].x;
cur.y=p[k].y;
cur.num=0;
break;
}
}
if(k==n)//若找不到,返回的矩阵的乘法次数为-1
{
cur.num=-1;//之前误写为cur.n的时候居然也过了,杭电数据没测出来啊
}
return cur;
}
int ii=i+1,jj=j-1,kk=ii;//若表达式是个式子,ii、jj分别是这个表达式去掉前后括号后的头和尾
node d1,d2,d3;//这个表达式应该是有两个表达式(也可能是矩阵)相乘得到的,d1、d2是两个表达式的值,d3是他们的积
if(s[ii]=='(')//若第一个是个式子
{
kk=findk(ii);//找到这个式子的后括号
d1=getnum(ii,kk);//求这个式子的值
}
else{//否则他应该是一个矩阵
d1=getnum(ii,ii);
kk=ii;
}
kk++;//第二个式子的开始处
if(s[kk]=='(')//若他是个式子
{
d2=getnum(kk,jj);//求从kk到最后的式子的值
}
else//若他是个矩阵
d2=getnum(jj,jj);
if(d1.num==-1||d2.num==-1||d1.y!=d2.x)//若至少有一个是非法矩阵(即有不可相乘的矩阵相乘得到)或两个矩阵无法相乘
{
d3.num=-1;
return d3;
}
d3.x=d1.x;//若合法,返回表达式的结果
d3.y=d2.y;
d3.num=d1.num+d2.num+d1.x*d1.y*d2.y;
return d3;
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)//读入矩阵数据
{
getchar();
p[i].n=getchar();
scanf("%d%d",&p[i].x,&p[i].y);
p[i].num=0;
}
getchar();
while(gets(s))
{
len=strlen(s);
node num=getnum(0,len-1);//计算式子的值
if(num.num==-1)
printf("error\n");
else
printf("%d\n",num.num);
}
return 0;
}
hdu 1082 Matrix Chain Multiplication--表达式求值
最新推荐文章于 2018-08-01 08:51:31 发布