题目链接点击打开链接
挑战密室
时间限制:
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还记得墙上各化学方程式用到的化学元素的原子量如下:
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<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<cstdlib>
#include<cstring>
using namespace std;
map<string,int>M;
int solve(string a)
{
map<string,int>M_count;
int s=0;
int fenzishu=1;
if(a[0]>='2'&&a[0]<='9')
fenzishu=a[0]-'0';
int len=a.length();
for(int i=0;i<len;i++)
{
if(isupper(a[i]))
{
string tmp;
tmp=a[i];
int yuanzishu=1;
if((i+1)<len&&isdigit(a[i+1])) //单原子分子
yuanzishu=a[i+1]-'0';
else if(islower(a[i+1])) //双原子分子
{
tmp+=a[i+1];
if((i+2)<len&&isdigit(a[i+2]))
yuanzishu=a[i+2]-'0';
}
if(M_count.count(tmp)==0)
M_count[tmp]=yuanzishu;
else
M_count[tmp]+=yuanzishu; //计数
}
else if(a[i]=='(')
{
string kuohao="";
for( i=i+1;a[i]!=')';i++) //之前这里顺手又定义了一遍i,导致程序崩溃,看了几遍终于看出来
{
kuohao=kuohao+a[i];
}
int fenzishu_kuohao=1;
if(isdigit(a[i+1]))
fenzishu_kuohao=a[i+1]-'0';
s+=solve(kuohao)*fenzishu_kuohao; //递归解决括号内的
}
}
int jieguo_kuohaowai=0;
map<string,int>::iterator it;
for(it=M.begin();it!=M.end();it++)
{
if(M_count.count(it->first))
jieguo_kuohaowai+=M[it->first]*M_count[it->first];
}
s+=jieguo_kuohaowai;
s*=fenzishu;
return s;
}
int main()
{
M["N"]=14;
M["C"]=12;
M["O"]=16;
M["Cl"]=35;
M["S"]=32;
M["Al"]=27;
M["H"]=2;
M["Ca"]=40;
M["Zn"]=65;
M["Na"]=23;
int t;
scanf("%d%*c",&t);
// cout<<t<<endl;
while(t--)
{
char c;
string a="";
bool flag1=false,flag2=false;
while(c=getchar())
{
if(c=='=')
flag1=true;
if(flag1==true&&(c=='+'||c=='\n'))
flag2=true; //要求的分子式已接收完,但是还要接收后面的字符
if(c=='\n'&&flag1==true)
break;
if(flag1==true&&c!='='&&flag2==false)
a+=c;
}
int s=solve(a);
printf("%04d\n",s);
// cout<<a<<endl;
}
// getchar();getchar(); getchar();getchar(); getchar();getchar(); getchar();getchar(); getchar();getchar();
system("pause");
return 0;
}
/*
3
2C+O2=2CO
2NaOH+H2SO4=Na2SO4+2H2O
Ca2CO3+H2O=Ca2(OH)2+CO2
*/