第八届河南省省赛 A.挑战密室

挑战密室

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
 
描述
R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室。Dr. Kong必须尽快找到解锁密码逃离,否则几分钟之后,WTO密室即将爆炸。

 

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

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

 

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

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

  

你能帮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.小括号最多一层.
来源
第八届河南省程序设计大赛

   好吧  ,我承认  这个题  确实  没做成功   一直报错   也不知道是为啥.   反正也是醉了   下面先附上  错误的代码   

  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<string.h>
  4 #include<math.h>
  5 using namespace std ;
  6 int main()
  7 {
  8     double q,l,m,n,t,sum,w,r;
  9     int i,e;
 10     char a[2050];
 11     scanf("%lf",&t);
 12     while(t--)
 13     {
 14         w=m=0;
 15         scanf("%s",a);
 16         l=strlen(a);
 17         for(i=0;i<l;i++)
 18         {
 19             if(a[i-1]=='=')
 20             {
 21                 break;
 22             }
 23         }
 24         e=i;
 25         for(sum=0;i<l;i++)
 26         {
 27             if(a[i]=='+')
 28                 break;
 29             if(a[e]-'0'>=0&&a[e]-'0'<=9)
 30             {
 31                 r=q=0;
 32                 while(a[i]-'0'>=0&&a[i]-'0'<=9)
 33                 {
 34                     r=r*pow(10,q)+(a[i]-'0');
 35                     q++;
 36                     if(!(a[i+1]-'0'>=0&&a[i+1]-'0'<=9))
 37                         break;
 38                     i++;
 39                 }
 40                 i++;
 41                 e=-1;
 42             }
 43             q=n=0;
 44             if(!(a[i]-'0'>=0&&a[i]-'0'<=9))  //当  这次不是数字     越界的时候 也不是数字哦.
 45             {
 46                 if(a[i]=='(')
 47                 {
 48                     i++;
 49                     while(a[i]=='('||a[i]!=')')
 50                     {
 51                         if(a[i]=='C'&&a[i+1]!='a')
 52                             m+=12;
 53                         else
 54                             if(a[i]=='H')
 55                         m+=2;
 56                         else
 57                             if(a[i]=='O')
 58                         m+=16;
 59                         else
 60                             if(a[i]=='N'&&a[i+1]!='a')
 61                         m+=14;
 62                         else
 63                             if(a[i]=='C'&&a[i+1]=='l')
 64                             {
 65                                 m+=35;
 66                                 i++;
 67                             }
 68                         else
 69                             if(a[i]=='S')
 70                             m+=32;
 71                         else
 72                             if(a[i]=='A'&&a[i+1]=='l')
 73                             {
 74                                 m+=27;
 75                                 i++;
 76                             }
 77                         else
 78                             if(a[i]=='C'&&a[i+1]=='a')
 79                             {
 80                                 m+=40;
 81                                 i++;
 82                             }
 83                         else
 84                             if(a[i]=='Z'&&a[i+1]=='n')
 85                             {
 86                                 m+=65;
 87                                 i++;
 88                             }
 89                         else
 90                             if(a[i]=='N'&&a[i+1]=='a')
 91                             {
 92                                 m+=23;
 93                                 i++;
 94                             }
 95                             if(a[i]==')')
 96                                 i++;
 97                         n=1;
 98                         i++;
 99                     }
100                 }
101                 else
102                 {
103 
104                         if(a[i]=='C'&&a[i+1]!='a')
105                             m+=12;
106                         else
107                             if(a[i]=='H')
108                         m+=2;
109                         else
110                             if(a[i]=='O')
111                         m+=16;
112                         else
113                             if(a[i]=='N'&&a[i+1]!='a')
114                         m+=14;
115                         else
116                             if(a[i]=='C'&&a[i+1]=='l')
117                             {
118                                 m+=35;
119                                 i++;
120                             }
121                         else
122                             if(a[i]=='S')
123                             m+=32;
124                         else
125                             if(a[i]=='A'&&a[i+1]=='l')
126                             {
127                                 m+=27;
128                                 i++;
129                             }
130                         else
131                             if(a[i]=='C'&&a[i+1]=='a')
132                             {
133                                 m+=40;
134                                 i++;
135                             }
136                         else
137                             if(a[i]=='Z'&&a[i+1]=='n')
138                             {
139                                 m+=65;
140                                 i++;
141                             }
142                         else
143                             if(a[i]=='N'&&a[i+1]=='a')
144                             {
145                                 m+=23;
146                                 i++;
147                             }
148                         n=1;       ////用于处理    当这个化学元素没有后缀时的情况
149                 }                            
150             }
151             if(a[i+1]-'0'>=0&&a[i+1]-'0'<=9)    //有后缀时.
152             {
153                 i++;
154                 n=0;
155                 while(a[i]-'0'>=0&&a[i]-'0'<=9)
156                 {
157                     n=n*pow(10,q)+(a[i]-'0');
158                     q++;
159                     if(!(a[i+1]-'0'>=0&&a[i+1]-'0'<=9))
160                         break;
161                     i++;
162                 }
163             }
164             sum=sum+m*n;
165             m=0;
166         }
167         printf("%04.lf\n",r*sum);
168         r=1;
169     }
170     return 0;
171 }

比较失败     当一道题   有思路但是是在解决不出来的时候    就删掉  优化着  在写一次.

 

-----------------------------------------------------------下面附上正确代码----------------------------------

  1 #include<stdio.h>
  2 #include<math.h>
  3 #include<string.h>
  4 #include<algorithm>
  5 using namespace std;
  6 int main()
  7 {
  8     int i,m,n,t,l,q,w,e,sum,r;
  9     char a[500],b[200];
 10     scanf("%d",&t);
 11     while(t--)
 12     {
 13         scanf("%s",a);                          //开始将需要的字符剥离出来
 14         l=strlen(a);
 15         bool OK =false;
 16         memset(b,'\0',sizeof(b));
 17         for(r=w=n=q=i=0;i<l;i++)
 18         {
 19             if(a[i-1]=='=')
 20                 OK=true;
 21             if(OK&&a[i]=='+')
 22             {
 23                 OK=false;
 24               //  b[r]='\0';
 25             }
 26             if(OK)
 27             {
 28                 if(q!=0)                             //  整理完数字       之后    就需要  转存字母了.
 29                 {
 30                     b[w++]=a[i];
 31                     continue;            //防止 到  else  那里在此赋值  .
 32                 }
 33                 if(((a[i]-'0')<=9&&(a[i]-'0')>=0)&&(w==0&&r==0))          //如果第一个是数字的话........
 34                 {
 35                     while((a[i]-'0')<=9&&(a[i]-'0')>=0)  //将数字 正整理一下
 36                     {
 37                         n=n*pow(10,q)+(a[i]-'0');
 38                         q++;
 39                         i++;
 40                     }  //整理完毕之后
 41                     i--;
 42                 }
 43                 else                     //不是数字的话
 44                 {
 45                     n=1;
 46                     b[r++]=a[i];
 47                 }
 48             }
 49         }
 50         l=strlen(b);
 51         for(sum=i=0;i<l;i++)
 52         {
 53             q=e=0;
 54             if(!(b[i]-'0'>=0&&b[i]-'0'<=9))  //当  这次不是数字     越界的时候 也不是数字哦.
 55             {
 56                 if(b[i]=='(')
 57                 {
 58                     i++;
 59                     m=0;
 60                 while(b[i]!=')')
 61                 {
 62                     if(b[i]=='C'&&b[i]=='a')
 63                 {
 64                     m+=40;
 65                     i++;
 66                 }
 67                 else
 68                     if(b[i]=='N'&&b[i+1]=='a')
 69                 {
 70                     m+=23;
 71                     i++;
 72                 }
 73                 else
 74                     if(b[i]=='Z'&&b[i+1]=='n')
 75                 {
 76                     m+=65;
 77                     i++;
 78                 }
 79                 else
 80                     if(b[i]=='A'&&b[i+1]=='l')
 81                 {
 82                     m+=27;
 83                     i++;
 84                 }
 85                 else
 86                     if(b[i]=='C'&&b[i+1]=='l')
 87                 {
 88                     m+=35;
 89                     i++;
 90                 }
 91                 else
 92                     if(b[i]=='C')
 93                 m+=12;
 94                 else
 95                     if(b[i]=='H')
 96                 m+=2;
 97                 else
 98                     if(b[i]=='O')
 99                 m+=16;
100                 else
101                     if(b[i]=='N')
102                 m+=14;
103                 else
104                     if(b[i]=='S')
105                 m+=32;
106                 i++;
107                     }
108                 }
109                 else
110                 if(b[i]=='C'&&b[i]=='a')
111                 {
112                     m=40;
113                     i++;
114                 }
115                 else
116                     if(b[i]=='N'&&b[i+1]=='a')
117                 {
118                     m=23;
119                     i++;
120                 }
121                 else
122                     if(b[i]=='Z'&&b[i+1]=='n')
123                 {
124                     m=65;
125                     i++;
126                 }
127                 else
128                     if(b[i]=='A'&&b[i+1]=='l')
129                 {
130                     m=27;
131                     i++;
132                 }
133                 else
134                     if(b[i]=='C'&&b[i+1]=='l')
135                 {
136                     m=35;
137                     i++;
138                 }
139                 else
140                     if(b[i]=='C')
141                 m=12;
142                 else
143                     if(b[i]=='H')
144                 m=2;
145                 else
146                     if(b[i]=='O')
147                 m=16;
148                 else
149                     if(b[i]=='N')
150                 m=14;
151                 else
152                     if(b[i]=='S')
153                 m=32;
154                 e=1;                            //用于处理    当这个化学元素没有后缀时的情况
155             }
156             if(b[i+1]-'0'>=0&&b[i+1]-'0'<=9)    //有后缀时.
157             {
158                 i++;
159                 e=0;
160                 while(b[i]-'0'>=0&&b[i]-'0'<=9)
161                 {
162                     e=e*pow(10,q)+(b[i]-'0');
163                     q++;
164                     if(!(b[i+1]-'0'>=0&&b[i+1]-'0'<=9))
165                         break;
166                     i++;
167                 }
168             }
169             sum=sum+m*e;
170         }
171         printf("%04.0lf\n",double(n*sum));
172     }
173     return 0;
174 }

------------------------下面附上 优化之后的  代码   并且   附上解析  -------教训总结--------------------------------   

 1 //  没写成  问题出在 字符的匹配上面  不能写的很简短.
 2 #include<stdio.h>
 3 #include<string.h>
 4 int i;
 5 int main()
 6 {
 7     int q,m,n,l,t,q1,q2,q3,c[10]={14,12,16,35,32,2,27,40,65,23};
 8     char a[500],b[10][2]={'N','C','O','Cl','S','H','Al','Ca','Zn','Na'};
 9     scanf("%d",&t);
10     while(t--)
11     {
12         scanf("%s",a);
13         l=strlen(a);
14         for(q1=i=0;i<l;i++)    //   得出  需要判定化学元素 在 表中的位置
15         {
16             if(a[i]=='=')
17                 q1=i+1;              //   q1  直接指的就是第一个元素  .
18             if(q1!=0&&a[i]=='+')
19             {
20                 q2=i+1;           //q2 指的是  元素后面的 +
21                 break;
22             }
23         }
24         for(m=q1;q1<q2;q1++)
25         {
26             q3=n=1;
27             for(i=0;i<10;i++)                            ////////////////////////////
28             {
29                 if(strcmp(b[i],a[q1])==0)
30                 {
31                     q=c[i];
32                     q1++;
33                 }
34             }
35             if(a[q1]<=9&&a[q1]>=0)  //  如果在  所求的元素内遇到了数字
36             {
37                 if(m==q1)
38                     n=a[q1]-'0';
39                 else
40                     q3=a[q1]-'0';
41             }
42             sum+=q3*q;
43         }
44 
45     }
46 }

 

你可能感兴趣的:(第八届河南省省赛 A.挑战密室)