nyoj-1236 挑战密室

挑战密室

时间限制:1 s | 内存限制:128 M

题目描述

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.小括号最多一层. 

这题没有提示的限制信息的话,感觉是道很难很难的题,写了几个小时都没写出来TT,最后根据提示写出这题,也花了1个小时的时间才敲出来。
结果交上去WA,debug很久,才发现少了个Zn,啊,心态崩了。
附代码:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int Max = 55;
 8 char st[Max];
 9 int main()
10 {
11     int k;
12     scanf("%d",&k);
13     while(k--)
14     {
15         int eq,num1=1,num2=0,pri,par=0,f=0;  //eq为等号所在的位置,num1为化学物的总个数 
16          scanf("%s",st);                    //num2单个化学物的总质量,par为括号内的总质量 
17          int len=strlen(st);                //pri是单个元素的质量,例如cl是35,f标记是否在括号内 
18          for(int i=0;i<len;i++)
19          {
20              if(st[i]=='=')
21              {
22                  eq=i+1;
23                  break;
24              }
25          }
26          while(st[eq]!='+'&&st[eq]!='')
27          {
28              if(st[eq]=='(')
29              f=1;
30              if(st[eq]==')')
31              f=0;
32              if(st[eq-1]=='='&&st[eq]>='0'&&st[eq]<='9')
33              num1=st[eq]-'0';
34              else if(st[eq]>='0'&&st[eq]<='9')
35              {
36                  if(f)
37                  par+=pri*(st[eq]-'0'-1);
38                  else if(!f&&st[eq-1]==')')
39                  par+=par*(st[eq]-'0'-1);
40                  else
41                  num2+=pri*(st[eq]-'0'-1);
42              }
43              else
44              {
45                  if(st[eq]=='N')
46                  {
47                      if(st[eq+1]=='a')
48                          pri=23;
49                      else
50                          pri=14;
51                  }
52                  else if(st[eq]=='C')
53                  {
54                      if(st[eq+1]=='a')
55                          pri=40;
56                      else if(st[eq+1]=='l')
57                          pri=35;
58                      else
59                          pri=12;
60                  }
61                  else if(st[eq]=='O')
62                  pri=16;
63                  else if(st[eq]=='S')
64                  pri=32;
65                  else if(st[eq]=='H')
66                  pri=2;
67                  else if(st[eq]=='A')
68                  pri=27;
69                  else if(st[eq]=='Z')
70                  pri=65;
71                  else           //因为我的代码是无论是否是化学元素,最后都会加一下pri,所以 
72                  {            //在这里加上一个else,如果不是表中的化学元素,而是数字什么的
73                      if(f)     // 就减去后面会加上的pri(主要是懒得在前面再加个大的判断语句了-_-) 
74                      par-=pri;
75                      else
76                      num2-=pri;
77                  }
78                  if(f)       //如上所说 
79                  par+=pri;
80                  else
81                  num2+=pri;
82                  //printf("%dpri
%d
",pri,num2);
83              }
84              eq++;
85            }
86            printf("%04d
",num1*(par+num2));
87        }
88        return 0;
89 }
90     
91          
View Code
原文地址:https://www.cnblogs.com/zmin/p/7109789.html