nyoj 1236 挑戰密室 第八屆河南省程序設計大賽

挑戰密室
時間限制: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行,每行爲一個化學方程式
輸出
對於每個化學方程式輸出一行:即密碼。
樣例輸入
32C+O2=2CO
2NaOH+H2SO4=Na2SO4+2H2O
Ca2CO3+H2O=Ca2(OH)2+CO2
樣例輸出
0056
0142
0116
提示
2≤K≤8 ,化學方程式的長度不超過50, 所有原子,分子的數量不超過9.小括號最多一層.
來源
第八屆河南省程序設計大賽

 
#include<stdio.h>
#include<string.h>
int sum,i;
char a[55];
int juden(int j){
 if(a[j]=='O')sum=16;
 if(a[j]=='H')sum=2;
 if(a[j]=='S')sum=32;
 if(a[j]=='Z'){
  sum=65; j++;
 }
 if(a[j]=='A'){
   sum=27; j++;
 }
 if(a[j]=='N'){
  if(a[j+1]=='a'){
   sum=23; j++;
  }
  else sum=14;
 }
 if(a[j]=='C'){
  if(a[j+1]=='a'){
   sum=40; j++;
   }
  else if(a[j+1]=='l'){
   sum=35; j++;
  }
  else sum=12;
 }
 if(a[j]>'1' && a[j]<='9')
  sum=sum*(a[j]-'0'-1);
 return j;
}
int main(){
 int i,j,t,k;
 int sum1,s,len,x;
 scanf("%d",&k);
 while(k--){
  s=0; x=1;
  scanf("%s",a);
  len=strlen(a);
  for(i=0;i<len;i++)
  if(a[i]=='=')break;
   i++;
  if(a[i]>'1'&&a[i]<='9'){
    x=a[i]-'0'; i++;
  }
  for(;i<len;i++){
   if(a[i]=='+') break;
   
    if(a[i]=='('){
     sum1=0; 
     for(i++;a[i]!=')';i++){
      i=juden(i);
      sum1+=sum;
      //printf("s1:%d",sum1);
     }
     if(a[i+1]>'1'&&a[i+1]<='9'){
      sum=sum1*(a[i+1]-'0');
      i++;
     }
     else sum=sum1;
     //printf("\ns1 %d ",sum);
    }
    
   else i=juden(i);
   
   s+=sum;
   //printf("%d ",s);
   } 
  printf("%04d\n",s*x);
 }
 return 0;
}
        








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章