挑战密室 时间限制: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 ",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,'',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]=''; 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 ",double(n*sum)); 172 } 173 return 0; 174 }
------------------------下面附上 优化之后的 代码 并且 附上解析 -------教训总结--------------------------------
1 2 #include <stdio.h> 3 #include <string.h> 4 char che[10][3]={"N","C","O","Cl","S","H","Al","Ca","Zn","Na"}; 5 int val[10]={14,12,16,35,32,2,27,40,65,23}; 6 int tonum(char str[]) 7 { 8 for(int i=0;i<10;i++) 9 if(strcmp(str,che[i])==0) 10 return val[i]; 11 } 12 int main() 13 { 14 int ncase; 15 char str[500]; 16 scanf("%d",&ncase); 17 while(ncase--) 18 { 19 memset(str,0,sizeof(str)); 20 scanf("%s",str); 21 bool flag=false; 22 int k=0; 23 char word[55]; 24 memset(word,0,sizeof(word)); 25 for(int i=0;i<strlen(str);i++) 26 { 27 if(flag&&str[i]=='+') 28 break; 29 if(str[i]=='=') 30 { 31 flag=true; 32 continue; 33 } 34 if(flag) 35 { 36 word[k++]=str[i]; 37 } 38 } 39 char ch[3]; 40 int sum=0,head=1,star=0,n; 41 if(word[0]>='0'&&word[0]<='9') 42 head=word[0]-'0',star=1; 43 for(int i=star;i<k;i++) 44 { 45 memset(ch,0,sizeof(ch)); 46 n=1; 47 if(word[i]=='(') 48 { 49 i++; 50 int temp=0; 51 while(word[i]!=')'&&i<k) 52 { 53 memset(ch,0,sizeof(ch)); 54 if((word[i]>='A'&&word[i]<='Z')&&(word[i+1]>='a'&&word[i+1]<='z')) 55 { 56 if(word[i+2]>='0'&&word[i+2]<='9') 57 n=word[i+2]-'0'; 58 ch[0]=word[i];ch[1]=word[i+1];ch[2]=''; 59 i++; 60 temp+=n*tonum(ch); 61 } 62 else if((word[i]>='A'&&word[i]<='Z')&&!(word[i+1]>='a'&&word[i+1]<='z')) 63 { 64 if(word[i+1]>='0'&&word[i+1]<='9') 65 n=word[i+1]-'0'; 66 ch[0]=word[i];ch[1]=''; 67 temp+=n*tonum(ch); 68 } 69 i++; 70 } 71 if(word[i+1]>='0'&&word[i+1]<='9') 72 n=word[i+1]-'0'; 73 sum+=n*temp; 74 } 75 else if((word[i]>='A'&&word[i]<='Z')&&(word[i+1]>='a'&&word[i+1]<='z')) 76 { 77 if(word[i+2]>='0'&&word[i+2]<='9') 78 n=word[i+2]-'0'; 79 ch[0]=word[i];ch[1]=word[i+1];ch[2]=''; 80 i++; 81 sum+=n*tonum(ch); 82 } 83 else if((word[i]>='A'&&word[i]<='Z')&&!(word[i+1]>='a'&&word[i+1]<='z')) 84 { 85 if(word[i+1]>='0'&&word[i+1]<='9') 86 n=word[i+1]-'0'; 87 ch[0]=word[i];ch[1]=''; 88 sum+=n*tonum(ch); 89 } 90 } 91 sum=sum*head; 92 printf("%04d ",sum); 93 } 94 return 0; 95 }