题目链接:http://nyoj.top/problem/1236

  • 内存限制:64MB 时间限制:1000ms

题目描述

R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室。Dr. Kong必须尽快找到解锁密码逃离,否则几分钟之后,WTO密室即将爆炸。

Dr. Kong发现密室的墙上写了许多化学方程式中。化学方程式,也称为化学反应方程式,是化学式表示物质化学反应的式子。化学方程式反映的是客观事实。因此书写化学方程式要遵守两个原则:一是必须以客观事实为基础;二是要遵守质量守恒定律。

化学方程式不仅表明了反应物、生成物和反应条件。同时,化学计量数代表了各反应物、生成物物质的量关系,通过相对分子质量或相对原子质量还可以表示各物质之间的质量关系,即各物质之间的质量比。对于气体反应物、生成物,还可以直接通过化学计量数得出体积比。例如:2NaOH+H2SO4=Na2SO4+2H2O

经过多次试探、推理,Dr. Kong发现密码是4位数字,就隐藏在化学方程式等号后的第一个分子中,其分子量就可能是密码(若分子量不足4位,前面加0)。

好在Dr. Kong还记得墙上各化学方程式用到的化学元素的原子量如下:

N

C

O

Cl

S

H

Al

Ca

Zn

Na

14

12

16

35

32

2

27

40

65

23

你能帮Dr. Kong尽快找到密码吗?

输入描述

第一行: K,表示有K个化学方程式;
接下来有K行,每行为一个化学方程式.

输出描述

对于每个化学方程式输出一行:即密码。

样例输入

3
2C+O2=2CO
2NaOH+H2SO4=Na2SO4+2H2O
Ca2CO3+H2O=Ca2(OH)2+CO2

样例输出

0056
0142
0116

提示

2≤K≤8 ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层.

解题思路

题意:求第一个生成物的分子质量。
思路:字符串模拟,稍微细心一下基本上都能过的。

#include <bits/stdc++.h>
using namespace std;
int i, len;
char str[55];
int Judge() {
    int t, wei, cnt, num, ans = 0;
    while (i < len && str[i] != '+' && str[i] != ')') {
        if (str[i] == '(') {
            i = i + 1;
            cnt = Judge();
            if (isdigit(str[++i])) {
                sscanf(str + i, "%d%n", &num, &wei);
                i += wei;
                cnt *= num;
            }
            ans += cnt;
        }
        cnt = 0;
        if (str[i] == 'N' && str[i + 1] == 'a')
            cnt = 23, i += 2;
        else if (str[i] == 'Z' && str[i + 1] == 'n')
            cnt = 65, i += 2;
        else if (str[i] == 'C' && str[i + 1] == 'a')
            cnt = 40, i += 2;
        else if (str[i] == 'A' && str[i + 1] == 'l')
            cnt = 27, i += 2;
        else if (str[i] == 'C' && str[i + 1] == 'l')
            cnt = 35, i += 2;
        else if (str[i] == 'H')
            cnt = 2, i++;
        else if (str[i] == 'S')
            cnt = 32, i++;
        else if (str[i] == 'O')
            cnt = 16, i++;
        else if (str[i] == 'C')
            cnt = 12, i++;
        else if (str[i] == 'N')
            cnt = 14, i++;
        if (isdigit(str[i])) {
            sscanf(str + i, "%d%n", &num, &wei);
            i += wei;
            cnt *= num;
        }
        ans += cnt;
    }
    return ans;
}
int main() {
    int t, ans;
    scanf("%d", &t);
    while (t--) {
        scanf("%s", str);
        len = strlen(str);
        for (i = 0; str[i] != '='; i++);
        if (isdigit(str[++i])) {
            ans = 0;
            while (isdigit(str[i]))
                ans = ans * 10 + str[i++] - '0';
        }
        else ans = 1;
        ans *= Judge();
        printf("%04d\n", ans);
    }
    return 0;
}