m0_74217538 2024-04-28 21:21 采纳率: 0%
浏览 3

CSP2019-12-3括号嵌套有一个测试点过不去

CSP2019-12-3 90分
在括号嵌套部分有一个测试点没过

#include<bits/stdc++.h>

using namespace std;
struct Ti{//结构体里面包括一个待定字符串和数字。可以对标元素及其数量 
    string s0="";
    unsigned long long count=0;//这个为多位数字到底是几位,像100,count为3,字母和符号都是0 
    int location=-1; 
    unsigned long long  sum=0;//这个是字母的个数; 
    int flag=0;
    int bracketflag=0;
    int bracketflag1=0; 
};
int getCharacter(struct Ti ti[],int size){//获取等号 
    for(int i=0;i<size;i++){
        if(ti[i].s0[0]=='=') return i;
    }
}
void numchange(struct Ti ti[],int size){//数字转化函数 
    int size0=size;
    for(int i=0;i<=size0;i++){
        unsigned long long s=0;
        if(ti[i].count>0){
          for (int j = 0; j < ti[i].count; j++) {
              long long s01=ti[i].s0[j];
                s01-='0';
                s+=s01*pow(10,ti[i].count-j-1);   
//                cout<<"执行"<<s<<endl;
            }
           ti[i].count = s; 
        }    
    }
}
void getFirst(struct Ti ti[],int size,int flag0){//系数处理函数 
    int t=0; int p=0;
    for(int i=0;i<=size;i++){
        if(ti[0].count>0){
            if(ti[i].flag==1) t=1;
            if(t==0){
                if(ti[i].sum==1) {
                ti[i].sum*=ti[0].count;
                }    
            }
        }
        else if(ti[i].flag==1){
//            cout<<ti[i].flag<<endl;
            t=1;
        }
        if(t>0&&t<=flag0&&ti[i].flag==t){
//            cout<<t<<endl;
            p=i+1;t++;
        }
        if(ti[p].count>0){
            if(ti[i].sum==1){
                ti[i].sum*=ti[p].count;    
//                cout<<ti[i].sum<<endl;
            }
        }
    }
}
void getbehind(struct Ti ti[],int size){
    int p=size;
    for(int i=0;i<=p;i++){ 
        if(ti[i].count>0&&ti[i-1].sum>0){
            ti[i-1].sum*=ti[i].count;
        } 
    }
}
void getbracketbehind(struct Ti ti[],int size,int bracketflag0){ //如  (Au(CN)2)
    int sizeb=size;
    unsigned long long p=1,t=1;
    for(int i=sizeb;i>0;i--){
        if(ti[i].count>0&&ti[i-1].bracketflag1==1){
             t=ti[i].count;p*=t;
        }
        if(p>1&&ti[i].sum>0) ti[i].sum*=p;
        if(ti[i].bracketflag1==-1){
            ti[i].bracketflag1=0;
            for(int j=i;j<=sizeb;j++){
                if(ti[j].bracketflag1==1){
                    if(ti[j+1].count>0) t=ti[j+1].count;
                    if(ti[j+1].count==0){
                        if(ti[j+1].s0[0]=='0'){
                            for(int k=j;k>=0;k--){
                                ti[k].sum=0;
                                if(ti[k].bracketflag!=0) break;
                            }
                        }
                        else t=1;
                    }
                    ti[j].bracketflag1=0;
                    break;
                }
            }
            p/=t;
        }    
//        cout<<t<<" "<<p<<" "<<i<<" "<<endl;    
    }
}
bool statistics(struct Ti ti[],int size){
    int f=0;
    int isolation=getCharacter(ti,size);
//    cout<<isolation<<endl;
    for (int i=0;i<isolation;i++){
         if(ti[i].sum>0){
             for(int j=i+1;j<isolation;j++){
                 if(ti[j].s0[0]==ti[i].s0[0]){
                     if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
//                         cout<<"true"<<" "<<j<<" "<<i<<" "<<ti[j].sum<<" "<<ti[i].sum<<" "<<ti[j].s0[1]<<" "<<ti[i].s0[1]<<endl;
                         ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                     }
                    if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
//                        cout<<"执行0"<<ti[i].s0[1]<<endl;
                        ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                    }
                 }
             }
         }
    } 
    for(int i=isolation+1;i<=size;i++){
          if(ti[i].sum>0){
             for(int j=i+1;j<=size;j++){
                 if(ti[j].s0[0]==ti[i].s0[0]){
                     if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
//                         cout<<"true"<<" "<<j<<" "<<i<<" "<<ti[j].sum<<" "<<ti[i].sum<<" "<<ti[j].s0[1]<<" "<<ti[i].s0[1]<<endl;
                         ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                     }
                    if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
                        ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                    }
                 }
             }
         }    
    }
     for(int i=0;i<isolation;i++){
             if(ti[i].sum>0){
                 for(int j=isolation+1;j<=size;j++){
                     if(ti[i].sum>0){
                         if(ti[j].s0[0]==ti[i].s0[0]){
                            if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
                                 if(ti[i].sum!=ti[j].sum) f++;
                                 ti[i].sum=0;ti[j].sum=0;
                           }
                           if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
                                if(ti[i].sum!=ti[j].sum) f++;
                                ti[i].sum=0;ti[j].sum=0;
                          }
                     }
                         
                     }
               }
             }
         }    
         for(int i=0;i<=size;i++){
             if(ti[i].sum>0) f++;
         }
         if(f==0) return true;
         else return false;
}
int main(){
    int n;cin>>n;string s;
    for(int i=0;i<n;i++){
        cin>>s;Ti ti[s.length()];int ti0=0;int flag0=0;int bracketflag0=0;int z=0;
        for(int j=0;j<s.length();j++){ 
        //存储函数,多位数字的location显示的是最右边数字的位置,大小写元素的位置显示的是大写字母位置,也就是前端位置
            if(s[j]=='+'||s[j]=='='||s[j]=='('||s[j]==')'){
                if(s[j-1]>='0'&&s[j-1]<='9') ti0++;
                if(s[j]=='+'||s[j]=='=') {
                    if((s[j]=='+'&&s[j+1]=='+')||(s[j]=='='&&s[j+1]=='=') ) z++;
                    flag0++;ti[ti0].flag=flag0;
                }
                if(s[j]=='('||s[j]==')') {
                    bracketflag0++;ti[ti0].bracketflag=bracketflag0;
                    if(s[j]=='(') ti[ti0].bracketflag1=-1;
                    if(s[j]==')') ti[ti0].bracketflag1=1;
                }
                ti[ti0].s0+=s[j];
                ti[ti0].location=j;
                ti0++;
            }
            if(s[j]>='A'&&s[j]<='Z'){
                if(s[j-1]>='0'&&s[j-1]<='9') ti0++;
                ti[ti0].s0+=s[j];
                if(s[j+1]>='a'&&s[j+1]<='z'){ti[ti0].s0+=s[j+1];}
                ti[ti0].location=j;ti[ti0].sum=1;
                if(j!=s.length()-1) ti0++;
                if((s[j+1]>='a'&&s[j+1]<='z')&&j==s.length()-2)ti0--;
            }
            if(s[j]>='0'&&s[j]<='9'){
                ti[ti0].s0+=s[j];    
                ti[ti0].location=j;//这个j应该是右值位置 
                ti[ti0].count++;
            }
        }
        numchange(ti,ti0);
        getFirst(ti,ti0,flag0);
        getbehind(ti,ti0); 
        getbracketbehind(ti,ti0,bracketflag0);
        bool f=statistics(ti,ti0);
//        for(int i0=0;i0<=ti0;i0++){
//                cout<<ti[i0].s0<<" "<<ti[i0].count<<" "<<"  "<<ti[i0].sum<<" "<<ti[i0].flag<<" "<<ti[i0].bracketflag<<" "<<ti[i0].location<<endl;
//            }
        if(z>0) f=false;
        if(f==true) cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    } 
    return 0;
}

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-04-28 21:21
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    这个问题是关于一个编程竞赛题目,具体是处理化学式中的括号嵌套问题。程序需要正确地解析化学式中元素的系数和数量,特别是处理括号内嵌套的情况。

    问题出现原因

    根据提供的代码和描述,问题可能出现的原因有:

    1. 逻辑错误:在处理括号嵌套时,程序的逻辑可能没有正确地处理所有情况,导致某些测试点无法通过。
    2. 边界条件未处理:可能存在边界条件未被正确处理,比如括号的匹配问题或者系数的累积问题。
    3. 输入数据格式问题:如果输入数据的格式与预期不一致,可能导致程序无法正确解析。

    问题解决方案

    为了解决这个问题,需要对代码进行调试和优化,确保它能够正确处理所有可能的括号嵌套情况。以下是一些可能的解决步骤:

    1. 审查和测试:对现有代码进行彻底的审查,特别是处理括号和系数的函数。
    2. 增加测试用例:编写更多的测试用例,特别是针对嵌套括号的情况,以发现并修复问题。
    3. 优化逻辑:根据测试结果,优化处理括号和系数的逻辑,确保所有情况都被正确处理。
    4. 错误处理:增加错误处理机制,确保程序能够优雅地处理异常输入。

    提供代码

    由于提供的问题描述中没有具体的错误信息或测试点,无法提供确切的代码解决方案。但是,可以提供一些通用的调试建议和代码审查点:

    • 确保numchange函数正确地将字符串转换为数字。
    • 检查getFirstgetbehindgetbracketbehind函数是否正确地处理了系数的乘法。
    • 确认statistics函数正确地统计了相同元素的数量,并处理了隔离元素。

    代码运行方式

    运行C++代码通常需要一个支持C++编译的IDE或者文本编辑器配合命令行编译器。可以使用如下步骤:

    1. 将代码复制到支持C++的文本编辑器中。
    2. 使用C++编译器(如g++)编译代码,例如在命令行中运行g++ -o program program.cpp
    3. 运行编译后的程序,例如在命令行中运行./program

    代码预期运行结果

    由于没有具体的测试用例和错误描述,无法提供预期的运行结果。但是,如果代码正确无误,它应该能够处理所有正确的化学式输入,并输出正确的“Y”或“N”。

    推荐相关链接

    以下是一些可能有帮助的资源链接:

    请注意,以上链接可能需要根据实际问题进行调整,以找到最合适的资源。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月28日