第八届河南省赛 zzuoj 10406: A.挑战密室 (模拟) 屌题

133 篇文章 0 订阅

10406: A.挑战密室

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 20   Solved: 7
[ Submit][ Status][ Web Board]

Description

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尽快找到密码吗?

Input

第一行: K     表示有K化学方程式;

接下来有K行,每行为一个化学方程式

2≤K≤8  ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层.

Output

对于每个化学方程式输出一行:即密码。

Sample Input

32C+O2=2CO2NaOH+H2SO4=Na2SO4+2H2OCa2CO3+H2O=Ca2(OH)2+CO2

Sample Output

005601420116

HINT

Source

第八届河南省赛

//刚开始少了个特判(0000),害我花了好长时间才找出来(T_T)。。。

AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
char s[100];
char ss[100];
char sc[100];
char c[100];
char cc[2];
int l,sum,q;
int zh(char *s)
{
    if(strcmp(s,"N")==0)return 14;
    else if(strcmp(s,"C")==0)return 12;
    else if(strcmp(s,"O")==0)return 16;
    else if(strcmp(s,"Cl")==0)return 35;
    else if(strcmp(s,"S")==0)return 32;
    else if(strcmp(s,"H")==0)return 2;
    else if(strcmp(s,"Al")==0)return 27;
    else if(strcmp(s,"Ca")==0)return 40;
    else if(strcmp(s,"Zn")==0)return 65;
    else if(strcmp(s,"Na")==0)return 23;
}
int solve(int p)  
{  
    while(c[p]!='('&&p<l)  
    {  
        int t=0;
        while(isdigit(c[p]))
            t=t*10+c[p++]-'0';
        if(t==0)  
            t++;
        int x=-1;  
        while(t--)  
        {  
            if(c[p]==')')  
                x=solve(p+1);  
            else 
            {
                if(c[p-1]>='a'&&c[p-1]<='z')
                    continue;
                if(c[p]>='a'&&c[p]<='z')
                {
                    ss[q++]=c[p];
                    ss[q++]=c[p+1];
                }
                else
                {
                    ss[q++]=c[p];
                }
            }
        }  
        if(x!=-1)  
            p=x;  
        p++;  
    }  
    return p;  
}  
int judge(int bb,int ee)
{
    for(int i=bb;i<ee;i++)
    {
        if(sc[i]>='A'&&sc[i]<='Z')
        {
            if(sc[i+1]>='A'&&sc[i+1]<='Z')
            {
                memset(cc,'\0',sizeof(cc)); 
                cc[0]=sc[i];
                sum+=zh(cc);
            }
            else
            {
                memset(cc,'\0',sizeof(cc));
                cc[0]=sc[i];
                cc[1]=sc[i+1];
                sum+=zh(cc);
            }
        }
    }
    return sum;
}
int main()
{
    int t,i,j,k,flag;
    int b,e;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
    	flag=0;
        memset(ss,'\0',sizeof(ss));
        memset(sc,'\0',sizeof(sc));
        memset(c,'\0',sizeof(c));
        sum=0;flag=0;
        gets(s);
        l=strlen(s);
        for(i=0;i<l;i++)
        {
            if(s[i]=='=')
            {
                b=i+1;
                break;
            }
        }
		if(b==l)//这块是特判(0000),很重要。
       		e=b;
       	else
        {
	    	for(i=b;i<l;i++)
	        {
	        	
	            if(s[i]=='+'||s[i]=='-')
	            {
	                e=i-1;
	                break;
	            }
	            else if(i==l-1)
	            {
	                e=i;
	                break;
	            }
	        }
        }
	    k=0;
	    for(i=e;i>=b;i--)
	    {
	        c[k++]=s[i];
	    }
	    l=strlen(c);
	    q=0;
	    solve(0);
	    int mm=0;
	    for(i=q-1;i>=0;i--)
	    {
	        if((ss[i]>='A'&&ss[i]<='Z')||(ss[i]>='a'&&ss[i]<='z'))
	            sc[mm++]=ss[i];
	    }
	    int ll=strlen(sc);
		if(c[k-1]>='0'&&c[k-1]<='9')
	        sum=(c[k-1]-'0')*judge(0,ll);
	    else
	        sum=judge(0,ll);
        printf("%04d\n",sum);
	}
    return 0;
}


//这个是刚开始的WA代码,少了个特判。。。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
char s[100];
char ss[100];
char sc[100];
char c[100];
char cc[2];
int l,sum,q;
int zh(char *s)
{
	if(strcmp(s,"N")==0)return 14;
	else if(strcmp(s,"C")==0)return 12;
	else if(strcmp(s,"O")==0)return 16;
	else if(strcmp(s,"Cl")==0)return 35;
	else if(strcmp(s,"S")==0)return 32;
	else if(strcmp(s,"H")==0)return 2;
	else if(strcmp(s,"Al")==0)return 27;
	else if(strcmp(s,"Ca")==0)return 40;
	else if(strcmp(s,"Zn")==0)return 65;
	else if(strcmp(s,"Na")==0)return 23;
}
int solve(int p)  
{  
    while(c[p]!='('&&p<l)  
    {  
        int t=0;
        while(isdigit(c[p]))
            t=t*10+c[p++]-'0';
        if(t==0)  
            t++;
        int x=-1;  
        while(t--)  
        {  
            if(c[p]==')')  
                x=solve(p+1);  
            else  
            {
            	if(c[p-1]>='a'&&c[p-1]<='z')
            		continue;
				if(c[p]>='a'&&c[p]<='z')
				{
					ss[q++]=c[p];
					ss[q++]=c[p+1];
				}
				else
				{
					ss[q++]=c[p];
				}
			}
        }  
        if(x!=-1)  
            p=x;  
        p++;  
    }  
    return p;  
}  
int judge(int bb,int ee)
{
	for(int i=bb;i<ee;i++)
	{
		if(sc[i]>='A'&&sc[i]<='Z')
		{
			if(sc[i+1]>='A'&&sc[i+1]<='Z')
			{
			 	memset(cc,'\0',sizeof(cc)); 
				cc[0]=sc[i];
				sum+=zh(cc);
			}
			else //if(sc[i+1]>='a'&&sc[i+1]<='z')
			{
				memset(cc,'\0',sizeof(cc));
				cc[0]=sc[i];
				cc[1]=sc[i+1];
				sum+=zh(cc);
			}
		}
	}
	return sum;
}
int main()
{
	int t,i,j,k;
	int b,e;
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		memset(ss,'\0',sizeof(ss));
		memset(sc,'\0',sizeof(sc));
		sum=0;
		gets(s);
		l=strlen(s);
		for(i=0;i<l;i++)
		{
			if(s[i]=='=')
			{
				b=i+1;
				break;
			}
		}
		for(i=b;i<l;i++)
		{
			if(s[i]=='+'||s[i]=='-')
			{
				e=i-1;
				break;
			}
			else if(i==l-1)
			{
				e=i;
				break;
			}
		}
		k=0;
		for(i=e;i>=b;i--)
		{
			c[k++]=s[i];
		}
		l=strlen(c);
		q=0;
		solve(0);
		int mm=0;
		for(i=q-1;i>=0;i--)
		{
			if((ss[i]>='A'&&ss[i]<='Z')||(ss[i]>='a'&&ss[i]<='z'))
				sc[mm++]=ss[i];
		}
		//printf("%s\n",sc);
		int ll=strlen(sc);
		//printf("%d\n",ll);
		if(c[k-1]>='0'&&c[k-1]<='9')
			sum=(c[k-1]-'0')*judge(0,ll);
		else
			sum=judge(0,ll);
		if(sum<10000)
			printf("%04d\n",sum);
		else
			printf("%d\n",sum%10000);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值