UVaOJ442
这题看着好长,但意思就只一个 ,先输入一个数n,要输入表示矩阵的个数,然后输入矩阵,注意前面的字母可以是乱序的,然后跟着两个正数。输入完n个数后,就开始输入矩阵的组合,要求输出是这些组合的的参与元素计算的个数
若: A 没有和它乘的,元素没参与乘,那么就是0
(AB) 若A为10 5 B为5 20 ,A的列数与B的行数相等,AB矩阵能相乘, 那么乘的次数是 5*20*10 (A的行乘以A的列乘以B的列,矩阵乘法的概念..)
(A(BC))累加次数即可。
----------------------------------------------------------------------------------------------------------------------------------------
这题 果断 栈 处理即可。这题没有太变态的数据,应该说都是正常的格式。一次AC~
#include<stdio.h>
#include<string.h>
typedef struct matrix
{
char a;
int row,col;
}matrix;
matrix M[1000],stack[10000];
char str[10000];
int top_a ,top;
int ok,sum;
void check(int m_top )
{
int i,j,k1,k2;matrix t1,t2,t3;
for(i = 0 ; i < strlen(str) ;i++)
{
if(str[i] == '(' )continue;
else if(str[i] == ')' )
{
if(top >=2)
{
t2 = stack[--top];
t1 = stack[--top];
if(t1.col != t2.row ){ok = 0;break;}
else
{
sum += t1.col * t1.row * t2.col ;
t3.row = t1.row;
t3.col = t2.col;
stack[top++] = t3;
}
}
else {ok = 0;break;}
}
else
{
char a = str[i];
for(j = 0;j<m_top ;j++)
{
if(a == M[j].a)break;
}
if(j<m_top)
{
stack[top++] = M[j];
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
int i=0;
while(n--)
{
getchar();//要注意
scanf("%c %d %d",&M[i].a ,&M[i].row ,&M[i].col );//%c 也能吸收字符
i++;
}
getchar(); //若此处没有getchar(),那么gets(str)直接接受回车结束了
while(gets(str))
{
if(str[0] == '\0')break;
top_a = 0;
top = 0;
ok = 1;sum = 0;
if(str[0]!='(')
{ printf("0\n");continue;}
check(i);
if(ok==0)printf("error\n");
else printf("%d\n",sum);
}
return 0;
}