2020-02-02(ccf201912-3化学方程式)

day1_頁面_08.png

这个代码用了很久才写出来,两天吧大概,但是因为ccf模拟考试进不去,所以耽误了两天时间才发出来

我不是很明白,没有得到100的原因,只得了\color{red}{90}分,我很迷茫,希望如果有大佬看到可以告知!

#include <iostream>
#include <map>
#include <vector>
#include <cstring>
 using namespace std;
 
 map<string, int> m1;
 map<string, int> m2;
 
 bool isnum(char c)
 {
    if(c>='0' && c<='9') return true;
    else return false;
 }
 
 bool isbig(char c)
  {
    if(c>='A' && c<='Z') return true;
    else return false;
  }
  
  
   void add(string s, bool flag, int index) // index 为下标, 必须为括号后的数字 
 {
    int i=0;
    int xs = 1; //系数
    string tmp = "";
    int tindex = 0; //下标  Cl2 中的 2 
//  int index = -1;  //下标 
    while(isnum(s[i]) && i<s.length())  //得到系数 
    {
        if(i == 0) xs = s[i] -'0';
        else xs = xs*10 + (s[i] -'0');
        i++;    
     }
     xs = xs * index; //得到系数 
     
     /*
        1. 遇到大写字母并且 tmp 不为空就要吧 tmp和 tindex * xs 存进 map 中
        2. 遇到数字,把数字记录下来,存进 tindex 中 
        3. 遇到括号,先把 tmp和 tindex进 map 中,再把号里的东西都存进tmp中并且记录index 递归一次
        4. 其他情况把遇到的字符先存进 tmp 中 
        5. 当存进map中时,若 tindex为 0,则存进去为 1 
     */ 
     
     for(; i<s.length(); i++)
       {
          if(isbig(s[i]) && tmp != "") //对应 1  
             {
                if(flag) 
                  {
                     if(tindex == 0) m1[tmp] += xs * 1; 
                     else   m1[tmp] += xs * tindex;
                     tindex = 0; //清零 
                     tmp = s[i];
                  } 
                else 
                  {
                     if(tindex == 0) m2[tmp] += xs * 1; 
                     else   m2[tmp] += xs * tindex;
                     tindex = 0; //清零 
                     tmp = s[i];
                  } 
             }
             
             
          else if(isnum(s[i]) && i<s.length())  //对应 2 
            {
                tindex = tindex *10 + (s[i] - '0');
            }
            
            
          else if(s[i] == '(')  //对应 3 
             {
                if(tmp != "")
                  {
                    if(flag) 
                     {
                        if(tindex == 0) m1[tmp] += xs * 1;
                        else    m1[tmp] += xs * tindex;
                     }
                    else 
                      {
                        if(tindex == 0) 
                           {
                              m2[tmp] += xs * 1;
//                            cout<<m2[tmp]<<endl;
                           }
                        else    m2[tmp] += xs * tindex;
                        
                       }
                    tmp = "";
                    tindex = 0;
                  }
                int x = 1;
                i++;
                for(int j=i; j<s.length(); j++)
                    {
                         if(s[j] == '(')  x++;
                         if(s[j] == ')')  x--;  
                         if(x == 0)
                          {
                            i = j+1;
                            break;
                          }
                          tmp += s[j];
                    }
                  
                  //找括号外边的数字
                    int index1 = 0; 
                  while(isnum(s[i]) && i<s.length()) 
                     {
                         index1 =index1 *10 + (s[i] - '0');
                         i++;
                     }
                   if(index1 == 0) index1 = 1;
                  add(tmp, flag, index1 * xs);
                  i--;// 因为等下还要i++ 
                  tindex = 0;
                  tmp="";
             }
            
            
            else // 对应 4 
            {
                tmp += s[i];
             } 
       } 
       
       if(tmp != "")
         {
            if(flag) 
                  {
                    
                     if(tindex == 0) 
                        {
                           m1[tmp] += xs * 1; 
//                         cout<<"tmp: "<<m1[tmp]<<endl;
                        }
                     else   m1[tmp] += xs * tindex;
                  } 
                else 
                  {
                     if(tindex == 0) m2[tmp] += xs * 1; 
                     else   m2[tmp] += xs * tindex;
                  } 
         }
 }
 
 
 bool isBan(string s)
 {
    
    vector<string> v1;
    vector<string> v2;
    string line;
    string line1;
    bool flag = false;
        for(int i=0; i<s.length(); i++)
         {
           if(s[i] == '=') 
            {
              flag = true;
              i++;
            }
            if(!flag) 
             {
               line += s[i];
             }
            else line1 += s[i];
        } 
        for(int t = line.find("+"); t != -1; t = line.find("+"))
          {
             v1.push_back(line.substr(0, t));
             line = line.substr(t+1);
          }
        v1.push_back(line);
       for(int t = line1.find("+"); t != -1; t = line1.find("+"))
         {
           v2.push_back(line1.substr(0, t));
           line1 = line1.substr(t+1); 
         }
        v2.push_back(line1);
//      cout<<v1.size()<<endl;
        
        for(int i=0; i<v1.size(); i++)
          {
//          cout<<"aaa"<<v1[i]<<endl;
            add(v1[i], true, 1);
          }
        for(int i=0; i<v2.size(); i++)
          {
//          cout<<"aaa"<<v2[i]<<endl;
            add(v2[i], false, 1);
          }
        
     map<string, int>::iterator it1;
     map<string, int>::iterator it2;
     it2 = m2.begin();
     bool flag1 = true;
//   cout<<"a"<<endl;
     for(it1 = m1.begin(); it1 != m1.end(); it1++)
     {
//      cout<<"a"<<endl;
//      cout<<it1 -> first<<" "<<it1 -> second<<endl;
//      cout<<it2 -> first<<" "<<it2 -> second<<endl; 
        if(it1 -> first == it2 -> first && it1 -> second == it2 -> second)
        {
            it2++;
         }
        else 
         {
            flag1 = false;
//          break;
         }
     }
     
     if(!flag1) return false;
     else return true;
 }
 
 
 int main()
 {
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    { 
      m1.clear();
      m2.clear();
      string s;
      cin>>s;
      if(isBan(s)) cout<<"Y"<<endl;
      else  cout<<"N"<<endl;
     }
 }
 
 
 /*
11
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
H2+O2=H2O
2H2+O2=2H2O
H2+Cl2=2NaCl
H2+Cl2=2HCl
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
Cu+As=Cs+Au
*/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354