挑战密室
时间限制: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.小括号最多一层.
题意:求化学反应方程式的第一种生成物的相对分子质量,难点在于细节处理。
栈的基本操作http://blog.youkuaiyun.com/qq_32680617/article/details/50634920
思想:利用栈的先进先出,这里括号只有一层,右下角数字都是一位的,无形中大大降低了难度。
这题和前几年省赛的《表达式求值》差不多。
代码
#include<stdio.h>
#include<string.h>
#include<string>
#include<stack>
#include<queue>
#include<math.h>
#include<limits.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
char str[55];//接收化学方程式
stack<char>q;//接收目标分子
int K;//K组化学方程式
scanf("%d",&K);
while(K--)
{
memset(str,'\0',sizeof(str));
scanf("%s",str);
int len=strlen(str);
int front_num=1;//等号后面的数字,初始化为1
for(int i=0; i<len; i++)//目标分子存入栈
{
if(str[i]=='=')//到了入栈的前一个字符
{
i++;
if(str[i]>='0'&&str[i]<='9')//等号后面可能还有数字
{
front_num=str[i]-'0';
i++;
}
while(str[i]!='+'&&str[i]!='\0')
{
q.push(str[i]);//目标分子入栈
i++;
}
break;
}
}
int sum=0;//目标分子分子量
int flag_num=1;//单原子数量,初始化为1
char flag_char;//原子种类
bool flag_flag=0;//括号内就标记为1,括号内不能初始化flag_num
while(!q.empty())
{
flag_char=q.top();
q.pop();
if(flag_char>='0'&&flag_char<='9')//处理元素数量
flag_num=flag_char-'0';
else if(flag_char==')')//处理括号状态
flag_flag=1;//记录处于括号内状态.
else if(flag_char=='(')//处理括号状态
flag_flag=0;//记录不处于括号内
else if(flag_char=='a'||flag_char=='n'||flag_char=='l')//处理两字母元素的情况
{
if(flag_char=='a'&&q.top()=='C')//Ca
sum+=40*flag_num;
else if(flag_char=='l'&&q.top()=='C')//Cl
sum+=35*flag_num;
else if(flag_char=='l'&&q.top()=='A')//Al
sum+=27*flag_num;
else if(flag_char=='n'&&q.top()=='Z')//Zn
sum+=65*flag_num;
else if(flag_char=='a'&&q.top()=='N')//Na
sum+=23*flag_num;
if(flag_flag==0)//当前元素不处于括号内
flag_num=1;//初始化原子数量
q.pop();
}
else if(flag_char=='N')
{
sum+=14*flag_num;
if(flag_flag==0)//当前元素不处于括号内
flag_num=1;//初始化原子数量
}
else if(flag_char=='C')
{
sum+=12*flag_num;
if(flag_flag==0)//当前元素不处于括号内
flag_num=1;//初始化原子数量
}
else if(flag_char=='O')
{
sum+=16*flag_num;
if(flag_flag==0)//当前元素不处于括号内
flag_num=1;//初始化原子数量
}
else if(flag_char=='S')
{
sum+=32*flag_num;
if(flag_flag==0)//当前元素不处于括号内
flag_num=1;//初始化原子数量
}
else if(flag_char=='H')
{
sum+=2*flag_num;
if(flag_flag==0)//当前元素不处于括号内
flag_num=1;//初始化原子数量
}
}
printf("%04d\n",sum*front_num);
}
return 0;
}