uvaoj442matrix the multiplication

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;

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值