第一行输入一个整数
代表矩阵的个数。
此后
行,第
行输入两个整数
和
代表第
个矩阵的行数和列数。
最后一行输入一个长度为
的字符串
代表运算式。运算式中只包含前
个大写字母与括号,第
个大写字母对应输入的第
个矩阵,括号成对出现,保证运算式合法且正确。
在一行上输出一个整数,代表计算需要的运算量。
3 50 10 10 20 20 5 (A(BC))
3500
3 50 10 10 20 20 5 ((AB)C)
15000
本题数据已进行修复(2025/01/09)。
#include <stdio.h> int cnt; char order [64]; char * p = order; int matr [16][2]; struct rtv { char r; char c; }; int S (struct rtv *); int P (struct rtv *); int E (struct rtv *); int A (struct rtv *); int S (struct rtv * r) { p += 1; int xx = P (r); p += 1; return xx; } int P (struct rtv * r) { struct rtv o1, o2; int calc = 0; calc += E (&o1); calc += E (&o2); r->r = o1.r; r->c = o2.c; calc += r->r * r->c * o1.c; return calc; } int E (struct rtv * r) { int cc; if (*p == '(') cc = S (r); else cc = A (r); return cc; } int A (struct rtv * r) { r->r = matr [*p - 'A'][0]; r->c = matr [*p - 'A'][1]; p += 1; return 0; } int main() { int n; scanf ("%d", &n); for (int i = 0; i < n; i++) { scanf ("%d", matr[i]); scanf ("%d", matr[i] + 1); } fgets (order, 64, stdin); fgets (order, 64, stdin); printf ("%d\n", S (&(struct rtv){})); return 0; }
//与四则运算有相同的思想,只不过这里的运算情况只有一种,所以符号栈可以省略 #include <stdio.h> #include <string.h> struct node{ int x; int y; }; int main() { int n; scanf("%d", &n); // int a[16][2] = {0}; struct node juzhen[16] = {0}; char str[45] = {0}; for(int i = 0; i < n; i++){ scanf("%d %d", &juzhen[i].x, &juzhen[i].y); } scanf("%s", str); // char stack1[46] = {0}; //括号栈 // int top1 = -1; struct node stack2[46] = {0} ; //矩阵栈 int top2 = -1; int sum = 0; for(int i = 0; i < strlen(str); i++){ if(str[i] == '('){ //stack1[++top1] = str[i]; }else if(str[i] >= 'A' && str[i] <= 'Z'){ stack2[++top2] = juzhen[str[i] - 'A']; }else if(str[i] == ')'){ //stack2连续pop出两个矩阵,并计算 struct node pop1, pop2; pop1 = stack2[top2--]; pop2 = stack2[top2--]; sum += pop2.x * pop2.y * pop1.y; //入栈 struct node tmp; tmp.x = pop2.x; tmp.y = pop1.y; stack2[++top2] = tmp; //stack1 pop出一个( //top1--; } } printf("%d", sum); return 0; }
#include <stdio.h> #include <ctype.h> #define ROW(m) (m >> 16) #define COL(m) (m & 0xFFFF) #define ROW_ADDR(r) (((unsigned short*)&(r))+1) #define COL_ADDR(c) ((unsigned short*)&(c)) /* 用一个 unsigned int 同时存储矩阵的行数和列数 默认了 int 是 32 位,short 是 16 位,其实应该用 uint32_t 之类的 */ unsigned cal(unsigned mat1, unsigned mat2, unsigned *out_mat) { /* 返回值是矩阵 mat1 * mat2 的乘法次数 */ /* out_mat 存储新矩阵的行数和列数 */ unsigned r1, r2, c2; r1 = ROW(mat1); /* 矩阵 mat1 的行数 */ r2 = COL(mat1); /* 矩阵 mat1 的列数等于矩阵 mat2 的行数 */ c2 = COL(mat2); /* 矩阵 mat2 的列数 */ *out_mat = (mat1 & 0xFFFF0000) | (mat2 & 0xFFFF); /* 新矩阵的行数是 mat1 的行数,新矩阵的列数是 mat2 的列数 */ return r1 * r2 * c2; } int main(void) { unsigned i, n, c, top; /* 不涉及负数,所以用 unsigned 没问题 */ unsigned cnt; /* 存储最终结果 */ while (scanf("%d", &n) == 1) { unsigned mats[n]; /* 存储逐行输入的矩阵行数和列数 */ unsigned st[n]; /* 最后一行输入字母时,将相应的矩阵入栈 */ for (i = 0; i != n; i++) { scanf("%hu%hu\n", /* hu 指明读取 unsigned short 类型 */ /* \n 不能漏掉,否则后面第一个 getchar() 会读取换行符 */ ROW_ADDR(mats[i]), /* 将行数存储在 unsigned int 的高 16 位 */ COL_ADDR(mats[i])); /* 将列数存储在 unsigned int 的低 16 位 */ } i = cnt = 0; top = -1; do { c = getchar(); if (isupper(c)) { /* 若为大写字母,则将矩阵入栈 */ st[++top] = mats[i++]; } else if (c == ')') {/* 题目指明括号匹配且输入合法,可以只考虑')' */ top--; cnt += cal(st[top], st[top+1], st+top); /* 先出栈的是 mat2,即右边的矩阵 后出栈的是 mat1,即左边的矩阵 这里 st[top] 是 mat1 st[top+1] 是 mat2 */ } }while (c != '\n' && c != EOF); printf("%u\n", cnt); } return 0; }
#include <stdio.h> #include <string.h> /* 因为都是乘法,且计算次数为矩阵数-1 循环(n=计算次数)次: 直接遍历字符串中AB型子串 计算结果AB相乘次数answer 并将AB改变为A , A的列数改为B的列数 字符串的子串部分由AB改为A */ int sqrs[15][2]; int count; char order[50]; void input() { scanf("%d", &count); for (int i = 0; i < count; i++) { scanf("%d %d", &sqrs[i][0], &sqrs[i][1]); } scanf("%s", order); } int calc(int r1, int c1, int c2) { return (r1 * c1 * c2); } /** AB->A (AB)->A */ void strchange(int start) { if (order[start] >= 'A' && order[start] <= 'P') { sqrs[order[start] - 'A'][1] = sqrs[order[start + 1] - 'A'][1]; strcpy(order + start + 1, order + start + 2); } else { sqrs[order[start + 1] - 'A'][1] = sqrs[order[start + 2] - 'A'][1]; order[start] = order[start + 1]; strcpy(order + start + 1, order + start + 4); } } int calculate() { int answer; int idx = 0; while (order[idx] != 0) { if (order[idx] >= 'A' && order[idx] <= 'P' && order[idx + 1] >= 'A' && order[idx + 1] <= 'P') { answer = calc(sqrs[order[idx] - 'A'][0], sqrs[order[idx] - 'A'][1], sqrs[order[idx + 1] - 'A'][1]); if (idx > 0 && order[idx - 1] == '(' && order[idx + 2] == ')') { strchange(idx - 1); } else { strchange(idx); } return answer; } idx++; } return 0; } int main() { int result=0; input(); for(int i=0;i<count;i++){ result+=calculate(); } printf("%d",result); return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ int top; char content[100]; } Stack; void push(Stack* stack, char c) { stack->content[++stack->top] = c; } char pop(Stack* stack) { char c = 0; if(stack->top > -1){ c = stack->content[stack->top]; stack->top--; } return c; } int Calculate(int a1[2], int a2[2], int* k, Stack* stack, int a[][2], int n) { int sum = 0; sum = a1[0] * a2[1] * a1[1]; *k += 1; push(stack, 'A'+n+*k-1); a[n+*k-1][0] = a1[0]; a[n+*k-1][1] = a2[1]; return sum; } int main() { int n; char matchrRule[100]; int len = 0; int total = 0; scanf("%d", &n); int a[2*n][2]; for(int i = 0; i < n; i++){ for(int j = 0; j < 2; j++){ scanf("%d", &a[i][j]); } } scanf("%s", matchrRule); len = strlen(matchrRule); Stack stack; stack.top = -1; int k = 0; for(int i = 0; i < len; i++){ if(matchrRule[i] != ')'){ push(&stack, matchrRule[i]); }else{ char c1 = pop(&stack); char c2 = pop(&stack); char c3 = pop(&stack); int *test1 = a[c2-'A']; int *test2 = a[c1-'A']; total += Calculate(a[c2-'A'], a[c1-'A'], &k, &stack, a, n); } } printf("%d\n", total); return 0; }
#include <stdio.h> #include <string.h> typedef struct matrix{ int row; int col; }Matrix; typedef struct stack{ Matrix m[100]; int top; }Stack; int main() { int n; int count = 0; char str[100] = {}; Matrix m[15] = {0}; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d %d", &m[i].row, &m[i].col); scanf("%s", str); int index = 0; //记录矩阵下标 Stack s = {{0},-1}; //初始化栈 int len = strlen(str); for(int i=0; i<len; i++) { if(str[i] != ')') //入栈 { if(isalpha(str[i])) memcpy(&s.m[++s.top],&m[index++],sizeof(Matrix)); } else //出栈,遇到')'就弹出两个矩阵,并把新矩阵压入栈中 { Matrix m1,m2,m3; memcpy(&m1, &s.m[s.top--], sizeof(Matrix)); memcpy(&m2, &s.m[s.top--], sizeof(Matrix)); m3.row = m2.row; m3.col = m1.col; memcpy(&s.m[++s.top],&m3,sizeof(Matrix)); count += m2.col*m2.row*m1.col; } } printf("%d", count); return 0; }
#include <stdio.h> #include <ctype.h> int mpos = 0, spos = 0; int matrix_calc(char *str, int *matrix, int *row, int *col) { int calc_num = 0; int matrixr_r = 0, matrixr_c = 0; int matrixl_r = 0, matrixl_c = 0; if (isupper(str[spos])) { matrixl_r = matrix[mpos++]; matrixl_c = matrix[mpos++]; spos++; } else if (str[spos] == '(') { spos++; calc_num += matrix_calc(str, matrix, &matrixl_r, &matrixl_c); } while (str[spos]) { if (str[spos] == '(') { spos++; calc_num += matrix_calc(str, matrix, &matrixr_r, &matrixr_c); calc_num += matrixl_r * matrixl_c * matrixr_c; matrixl_c = matrixr_c; } if (isupper(str[spos])) { matrixr_r = matrix[mpos++]; matrixr_c = matrix[mpos++]; calc_num += matrixl_r * matrixl_c * matrixr_c; matrixl_c = matrixr_c; } if (str[spos++] == ')') break; }; *row = matrixl_r; *col = matrixl_c; return calc_num; } int main() { int matrix[30], index = 0; int count, row, col; char str[128] = {0}; scanf("%d", &count); while (count--) { scanf("%d %d", &row, &col); matrix[index++] = row; matrix[index++] = col; } scanf("%s", str); row = col = 0; printf("%d", matrix_calc(str, matrix, &row, &col)); return 0; }
#include <stdio.h> int main() { int n,input[15][2],stack[15][2],cnt=0,i,j=0; char str[50]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&input[i][0],&input[i][1]); } scanf("%s",str); i=0; while(str[i]!='\0') { if(str[i]>='A'&&str[i]<='Z') { stack[j][0]=input[str[i]-'A'][0]; stack[j][1]=input[str[i]-'A'][1]; j++; } else if(str[i]==')') { cnt+=stack[j-1][0]*stack[j-1][1]*stack[j-2][0]; stack[j-2][1]=stack[j-1][1]; j--; } i++; } printf("%d\n",cnt); return 0; }比四则运算那道题简单太多了
#include "stdio.h" #include "stdlib.h" #include "string.h" int stack1[100][2]; int stack_pointer; void push(int a, int b); void pop(int *a, int *b); int main() { int num,len; int a,b,c,d, sum; //计算乘法次数用 while(scanf("%d", &num) != EOF) { int k=0; int matrix[100][2] = {0}; char str1[100] = {0}; /*初始化*/ sum = 0; stack_pointer = -1;//栈指针复位到-1位置。 memset(stack1,0,200*sizeof(int)); for(int i=0; i<num; i++) { for(int j=0; j<2; j++) { scanf("%d", &matrix[i][j]); } } scanf("%s", str1); len = strlen(str1); for(int i=0; i<len; i++) { if(str1[i] >= 'A' && str1[i] <= 'Z') { push(matrix[k][0], matrix[k][1]); k++; } else if(str1[i] == ')') { pop(&c,&d); pop(&a,&b); if(c == b) { sum += a*b*d;//求乘法次数 push(a,d);//把相乘形成的新数组压入栈 } else { printf("error\n"); } } else ; } printf("%d\n", sum); } return 0; } void push(int a, int b) { stack_pointer++; stack1[stack_pointer][0] = a; stack1[stack_pointer][1] = b; } void pop(int *a, int *b) { *a = stack1[stack_pointer][0]; *b = stack1[stack_pointer][1]; stack1[stack_pointer][0] = 0; stack1[stack_pointer][1] = 0; stack_pointer--; }
#include<stdio.h> int main() { int n; while(scanf("%d",&n) != EOF) { int juzhen[100][2]; int b[100][2]; char a[100] = {0}; for(int i = 0;i < n;i++) { scanf("%d",&juzhen[i][0]); scanf("%d",&juzhen[i][1]); } scanf("%s",&a); int len = strlen(a); int sum = 0; int i = 0; int j = 0; int count = 0; while(i < len) { if(a[i] == '(') { i++; } if(a[i] >= 'A' && a[i] <= 'Z') { b[j][0] = juzhen[a[i] - 'A'][0]; b[j][1] = juzhen[a[i] - 'A'][1]; i++; j++; if(a[i] >= 'A' && a[i] <= 'Z') { b[j][0] = juzhen[a[i] - 'A'][0]; b[j][1] = juzhen[a[i] - 'A'][1]; i++; j++; } if(a[i] == '(') { i++; } if(a[i] == ')') { j--; sum += b[j - 1][0] * b[j - 1][1] * b[j][1]; b[j - 1][1] = b[j][1]; i++; } } if(a[i] == ')') { j--; sum += b[j - 1][0] * b[j - 1][1] * b[j][1]; b[j - 1][1] = b[j][1]; i++; } } printf("%d\n",sum); } return 0; }