zoukankan      html  css  js  c++  java
  • L3-1 代码排版(考虑超级全)

    这道题目真的是绝了, 网上好多代码都是错的

    但是题目可以水过去, 

    求 这个代码 过不了的样例

    我甚至都把  (),  "" 里面可能出现的 for, if , 

    变量名字是 -if, _for  的都考虑到了, 还差什么吗,wc

    下面这个代码还有个条件为考虑到

    _for 不统计

    但是 for_ 统计, 因此我们特判的时候 Check(i - 1) 是前面的

    Check( i + len) 是后面的就可以了

    //getline
    //加括号 + 判断语句结束
    //skip, erase处理空格
    //处理空格之后加空格
    //字符串会 erase, insert 而发生变化
    ///printf(";;;")里面的内容会干扰。。。我服了
    ///不仅仅要注意 ()里面的, 而且还有 "" 的影响...
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    bool newline = false;
    string s;
    //stack
    inline void print(int x){
        while(x--)  printf("  ");
    }
    
    inline void print2(int &i){    ///In s[i] != '(', Out s[i] ! = ')', 输出括号内容
        cout<<"(";
        int cnt = 1;
        while(cnt && i < s.size()){
            printf("%c", s[i]);
            if(s[i] == '(') cnt++;
            else if(s[i] == ')')    cnt--;
            i++;
        }
    }
    
    inline bool Check(int i){
        if(i < 0)   return true;
        if(s[i] == ' ' || s[i] == ';' || s[i] == '{' || s[i] == '}'||s[i] == ')' || s[i] == '(')  return true;
        return false;
    }
    
    inline bool judge(int i, string x){    ///s[i,...] == x;
        if(s.size() - i < x.size()) return false;
        if(s.substr(i, x.size()) == x)  return true;
        else    return false;
    }
    
    inline int judge2(int i){///judge :for, else, if, while
        if(judge(i, "for") && Check(i-1)) return 3;
        if(judge(i, "if") && Check(i-1)) return 2;
        if(judge(i, "else") && Check(i-1)) return 4;
        if(judge(i, "while") && Check(i-1)) return 5;
        return -1;///false
    }
    
    inline void skip(int &i){//跳空格,return i, s[i] != ' '
        while(s[i] == ' ')  i++;
    }
    
    inline void skip2(int &i){//跳(); return i, s[i] != ')', IN s[i] != '('
        int cnt = 1;    i++;
        while(cnt && i < s.size()){
            if(s[i] == '(') cnt++;
            else if(s[i] == ')')    cnt--;
            i++;
        }
    }
    
    void lookif(int &i);
    void lookfor(int &i);
    void lookelse(int &i);
    void lookwhile(int &i);
    void look2(int &i);
    int lookthrough(int st);
    
    void lookif(int &i){
        if(s[i] == '{') look2(++i);
        else    i = lookthrough(i);
        ///自动调动else查看 if ; else;
        skip(i);        //, 这个if else 不需要找,题目不要求
        //printf("*****************************************-=-=-=-=-=-=-=-=-=-=-==-=-=-I : %d
    ", i);
        if(judge(i, "else") && Check(i-1)){
            i += 4;     skip(i);    lookelse(i);        ///注意 += 4;
        }
    }
    
    void lookfor(int &i){
        if(s[i] == '{') look2(++i);
        else    i = lookthrough(i);
    }
    
    void lookelse(int &i){///panduan 是不是 else if
        //wc, 题目没要求处理 else if连贯,但是else要求了
        /*if(judge(i, "if")){////else if
            i += 2; skip(i);    skip2(i);   skip(i);
            lookif(i);
        }else{///else
            if(s[i] == '{') look2(++i);
            else    i = lookthrough(i);
        }*/
        if(s[i] == '{') look2(++i);
        else    i = lookthrough(i);
    }
    
    void lookwhile(int &i){
        if(s[i] == '{') look2(++i);
        else    i = lookthrough(i);
    }
    
    void look2(int &i){//处理的是yi ge {}的内容, return s[i] != '}', In s[i] != '{'
        int cnt = 1;
        int cnt2 = 0;       ///fang zhi ()
        bool mark = 0;      ///fang zhi ""
        while(cnt && i < s.size()){
            if(s[i] == '('){
                int x = 1;  i++;
                while(x){
                    if(s[i] == '(') x++;
                    else if(s[i] == ')')    x--;
                    i++;
                }
                i--;    continue;
            }
            if(s[i] == '"'){
                i++;
                for(;; i++){
                    if(s[i] == '"') break;
                    i++;
                }
                continue;
            }
            if(s[i] == '{') cnt++;
            else if(s[i] == '}')    cnt--;
            i++;
        }
    }
    
    
    int lookthrough(int st){///寻找的是"一句话"的结尾,只要是无{}, 就可以调用, return s[i] != '}', in s[i] != '{'
        bool flag = false;
        int t2;
        int cnt = 0;
        for(int i = st; i < s.size(); i++){
            if(s[i] == '"'){
                for(i = i + 1; true; i++){
                    if(s[i] == '"') break;
                }///不需要i ++ 了
                continue;
            }
            if(s[i] =='(')  cnt++;
            else if(s[i] == ')')    cnt--;
            if(!flag && s[i] == ';' && cnt == 0){
                i++;
                return i;
            }
            t2 = judge2(i);
            if(cnt == 0 && (Check(i-1)) && t2 != -1){///关键字找到了,进行递归处理
                flag = true;        ///注意这个flag = true md!!
                i += t2;    skip(i);
                if(i != 4)  skip2(i), skip(i);      ///跳两次空格, ()前后各一次
                switch(t2){
                    case 2: lookif(i);      break;
                    case 3: lookfor(i);     break;
                    case 4: lookelse(i);    break;
                    case 5: lookwhile(i);   break;
                }
                return i;
            }
        }
    }
    
    int main()
    {
        getline(cin, s);
        int t2;
        int cnt = 0;
        
        //printf("S1:
    ");
        //cout<<s<<endl;
        
        //解决加括号的难题
        int mark = 0;
        t2 = cnt = 0;
        for(int i = 0; i < s.size(); i++){
            t2 = judge2(i);         ///核实if for else while
            //cout<<i;
            if(s[i] == '"'){
                for(i = i + 1; true; i++){
                    if(s[i] == '"') break;
                }///不需要i ++ 了
                continue;
            }
            if(s[i] == '(') mark++;
            else if(s[i] == ')')    mark--;
            if(mark == 0 && t2 != -1){
                cnt++;
                //cout<<"   !!!!!!";
                i += t2;
                ///注意空格需要跳跃两次
                skip(i);                ///跳' '
                if(t2 != 4) skip2(i), skip(i);   ///跳过 () 寻找 {}
                //cout<<"  ";
                if(s[i] != '{'){
                    s.insert(i, "{");   i++;    ///然后需要找尾部,这个是一个递归的过程
                    //cout<<"
    "<<s[i]<<s[i+1]<<endl;
                    int j = lookthrough(i); 
                    s.insert(j, "}");   ///lookthrough 是寻找这个没有括号{} 的终点
                    i--;        ///抵消 i++
                }
            }
        }
        //printf("补全括号后的");
        //printf("S2:
    ");
        //cout<<s<<endl;
        
        ///输出
        int st, ed;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == '{'){
                st = i; break;
            }
        }
        for(int i = st - 1; i >= 0; i--){
            if(s[i] != ' '){
                ed = i; break;
            }
        }
        //printf("ST:%d, ED:%d
    ", st, ed);
        ///int main
        for(int i = 0; i <= ed; i++){
            printf("%c", s[i]);
        }
        printf("
    ");
        
        newline = false;
        cnt = 0, t2;
        int cnt2;
        
        for(int i = st; i < s.size(); i++){
            t2 = judge2(i);
            if(s[i] == '('){
                if(newline){///这个小bug, wc
                    newline = false;
                    cnt2 = cnt;
                    while(cnt2--){
                        printf("  ");
                    }
                }
                i++;    print2(i); i--; continue;
            }
            if(s[i] == '"'){
                if(newline){///这个小bug, wc
                    newline = false;
                    cnt2 = cnt;
                    while(cnt2--){
                        printf("  ");
                    }
                }
                printf(""");
                i++;    int j;
                for(j = i; true; j++){
                    printf("%c", s[j]);
                    if(s[j] == '"'){
                        j++;   break;
                    }
                }
                i = j;  i--;    continue;
            }
            if(s[i] == '}'){
                newline = true;    --cnt;
                cnt2 = cnt;
                while(cnt2--){
                    printf("  ");
                }
                printf("}
    ");  i++;    skip(i);    i--;
                continue;
            }
            if(newline){
                newline = false;
                cnt2 = cnt;
                while(cnt2--){
                    printf("  ");
                }
            }
            if(t2 != -1){
                if(t2 == 2){
                    printf("if ");  i += 2; skip(i);
                    print2(++i);    printf(" ");    skip(i);    i--;
                }else if(t2 == 3){
                    printf("for ");  i += 3; skip(i);
                    print2(++i);    printf(" ");    skip(i);    i--;
                }else if(t2 == 4){
                    printf("else ");  i += 4; skip(i);
                    skip(i);    i--;
                }else if(t2 == 5){
                    printf("while ");  i += 5; skip(i);
                    print2(++i);    printf(" ");    skip(i);    i--;
                }
            }else if(s[i] == ';'){
                newline = true; printf(";
    ");    i++;    skip(i);    i--;  
            }else if(s[i] == '{'){
                cnt++;
                newline = true; printf("{
    ");  i++;    skip(i);    i--;    
            }else if(s[i] == '('){
                i++;    print2(i);  i--;
            }else{
                printf("%c", s[i]);
            }
        }
        
        return 0;
    }

    修改之后的代码

    //getline
    //加括号 + 判断语句结束
    //skip, erase处理空格
    //处理空格之后加空格
    //字符串会 erase, insert 而发生变化
    ///printf(";;;")里面的内容会干扰。。。我服了
    ///不仅仅要注意 ()里面的, 而且还有 "" 的影响...
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    bool newline = false;
    string s;
    //stack
    inline void print(int x){
        while(x--)  printf("  ");
    }
    
    inline void print2(int &i){    ///In s[i] != '(', Out s[i] ! = ')', 输出括号内容
        cout<<"(";
        int cnt = 1;
        while(cnt && i < s.size()){
            printf("%c", s[i]);
            if(s[i] == '(') cnt++;
            else if(s[i] == ')')    cnt--;
            i++;
        }
    }
    
    inline bool Check(int i){
        if(i < 0)   return true;
        if(s[i] == ' ' || s[i] == ';' || s[i] == '{' || s[i] == '}'||s[i] == ')' || s[i] == '(')  return true;
        return false;
    }
    
    inline bool judge(int i, string x){    ///s[i,...] == x;
        if(s.size() - i < x.size()) return false;
        if(s.substr(i, x.size()) == x)  return true;
        else    return false;
    }
    
    inline int judge2(int i){///judge :for, else, if, while
        if(judge(i, "for") && Check(i-1) && Check(i + 3)) return 3;
        if(judge(i, "if") && Check(i-1) && Check(i + 2)) return 2;
        if(judge(i, "else") && Check(i-1) && Check(i + 4)) return 4;
        if(judge(i, "while") && Check(i-1) && Check(i + 5)) return 5;
        return -1;///false
    }
    
    inline void skip(int &i){//跳空格,return i, s[i] != ' '
        while(s[i] == ' ')  i++;
    }
    
    inline void skip2(int &i){//跳(); return i, s[i] != ')', IN s[i] != '('
        int cnt = 1;    i++;
        while(cnt && i < s.size()){
            if(s[i] == '(') cnt++;
            else if(s[i] == ')')    cnt--;
            i++;
        }
    }
    
    void lookif(int &i);
    void lookfor(int &i);
    void lookelse(int &i);
    void lookwhile(int &i);
    void look2(int &i);
    int lookthrough(int st);
    
    void lookif(int &i){
        if(s[i] == '{') look2(++i);
        else    i = lookthrough(i);
        ///自动调动else查看 if ; else;
        skip(i);        //, 这个if else 不需要找,题目不要求
        //printf("*****************************************-=-=-=-=-=-=-=-=-=-=-==-=-=-I : %d
    ", i);
        if(judge(i, "else") && Check(i-1) && Check(i + 4)){
            i += 4;     skip(i);    lookelse(i);        ///注意 += 4;
        }
    }
    
    void lookfor(int &i){
        if(s[i] == '{') look2(++i);
        else    i = lookthrough(i);
    }
    
    void lookelse(int &i){///panduan 是不是 else if
        //wc, 题目没要求处理 else if连贯,但是else要求了
        /*if(judge(i, "if")){////else if
            i += 2; skip(i);    skip2(i);   skip(i);
            lookif(i);
        }else{///else
            if(s[i] == '{') look2(++i);
            else    i = lookthrough(i);
        }*/
        if(s[i] == '{') look2(++i);
        else    i = lookthrough(i);
    }
    
    void lookwhile(int &i){
        if(s[i] == '{') look2(++i);
        else    i = lookthrough(i);
    }
    
    void look2(int &i){//处理的是yi ge {}的内容, return s[i] != '}', In s[i] != '{'
        int cnt = 1;
        int cnt2 = 0;       ///fang zhi ()
        bool mark = 0;      ///fang zhi ""
        while(cnt && i < s.size()){
            if(s[i] == '('){
                int x = 1;  i++;
                while(x){
                    if(s[i] == '(') x++;
                    else if(s[i] == ')')    x--;
                    i++;
                }
                i--;    continue;
            }
            if(s[i] == '"'){
                i++;
                for(;; i++){
                    if(s[i] == '"') break;
                    i++;
                }
                continue;
            }
            if(s[i] == '{') cnt++;
            else if(s[i] == '}')    cnt--;
            i++;
        }
    }
    
    
    int lookthrough(int st){///寻找的是"一句话"的结尾,只要是无{}, 就可以调用, return s[i] != '}', in s[i] != '{'
        bool flag = false;
        int t2;
        int cnt = 0;
        for(int i = st; i < s.size(); i++){
            if(s[i] == '"'){
                for(i = i + 1; true; i++){
                    if(s[i] == '"') break;
                }///不需要i ++ 了
                continue;
            }
            if(s[i] =='(')  cnt++;
            else if(s[i] == ')')    cnt--;
            if(!flag && s[i] == ';' && cnt == 0){
                i++;
                return i;
            }
            t2 = judge2(i);
            if(cnt == 0 && (Check(i-1)) && t2 != -1){///关键字找到了,进行递归处理
                flag = true;        ///注意这个flag = true md!!
                i += t2;    skip(i);
                if(i != 4)  skip2(i), skip(i);      ///跳两次空格, ()前后各一次
                switch(t2){
                    case 2: lookif(i);      break;
                    case 3: lookfor(i);     break;
                    case 4: lookelse(i);    break;
                    case 5: lookwhile(i);   break;
                }
                return i;
            }
        }
    }
    
    int main()
    {
        getline(cin, s);
        int t2;
        int cnt = 0;
        
        //printf("S1:
    ");
        //cout<<s<<endl;
        
        //解决加括号的难题
        int mark = 0;
        t2 = cnt = 0;
        for(int i = 0; i < s.size(); i++){
            t2 = judge2(i);         ///核实if for else while
            //cout<<i;
            if(s[i] == '"'){
                for(i = i + 1; true; i++){
                    if(s[i] == '"') break;
                }///不需要i ++ 了
                continue;
            }
            if(s[i] == '(') mark++;
            else if(s[i] == ')')    mark--;
            if(mark == 0 && t2 != -1){
                cnt++;
                //cout<<"   !!!!!!";
                i += t2;
                ///注意空格需要跳跃两次
                skip(i);                ///跳' '
                if(t2 != 4) skip2(i), skip(i);   ///跳过 () 寻找 {}
                //cout<<"  ";
                if(s[i] != '{'){
                    s.insert(i, "{");   i++;    ///然后需要找尾部,这个是一个递归的过程
                    //cout<<"
    "<<s[i]<<s[i+1]<<endl;
                    int j = lookthrough(i); 
                    s.insert(j, "}");   ///lookthrough 是寻找这个没有括号{} 的终点
                    i--;        ///抵消 i++
                }
            }
        }
        //printf("补全括号后的");
        //printf("S2:
    ");
        //cout<<s<<endl;
        
        ///输出
        int st, ed;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == '{'){
                st = i; break;
            }
        }
        for(int i = st - 1; i >= 0; i--){
            if(s[i] != ' '){
                ed = i; break;
            }
        }
        //printf("ST:%d, ED:%d
    ", st, ed);
        ///int main
        for(int i = 0; i <= ed; i++){
            printf("%c", s[i]);
        }
        printf("
    ");
        
        newline = false;
        cnt = 0, t2;
        int cnt2;
        
        for(int i = st; i < s.size(); i++){
            t2 = judge2(i);
            if(s[i] == '('){
                if(newline){///这个小bug, wc
                    newline = false;
                    cnt2 = cnt;
                    while(cnt2--){
                        printf("  ");
                    }
                }
                i++;    print2(i); i--; continue;
            }
            if(s[i] == '"'){
                if(newline){///这个小bug, wc
                    newline = false;
                    cnt2 = cnt;
                    while(cnt2--){
                        printf("  ");
                    }
                }
                printf(""");
                i++;    int j;
                for(j = i; true; j++){
                    printf("%c", s[j]);
                    if(s[j] == '"'){
                        j++;   break;
                    }
                }
                i = j;  i--;    continue;
            }
            if(s[i] == '}'){
                newline = true;    --cnt;
                cnt2 = cnt;
                while(cnt2--){
                    printf("  ");
                }
                printf("}
    ");  i++;    skip(i);    i--;
                continue;
            }
            if(newline){
                newline = false;
                cnt2 = cnt;
                while(cnt2--){
                    printf("  ");
                }
            }
            if(t2 != -1){
                if(t2 == 2){
                    printf("if ");  i += 2; skip(i);
                    print2(++i);    printf(" ");    skip(i);    i--;
                }else if(t2 == 3){
                    printf("for ");  i += 3; skip(i);
                    print2(++i);    printf(" ");    skip(i);    i--;
                }else if(t2 == 4){
                    printf("else ");  i += 4; skip(i);
                    skip(i);    i--;
                }else if(t2 == 5){
                    printf("while ");  i += 5; skip(i);
                    print2(++i);    printf(" ");    skip(i);    i--;
                }
            }else if(s[i] == ';'){
                newline = true; printf(";
    ");    i++;    skip(i);    i--;  
            }else if(s[i] == '{'){
                cnt++;
                newline = true; printf("{
    ");  i++;    skip(i);    i--;    
            }else if(s[i] == '('){
                i++;    print2(i);  i--;
            }else{
                printf("%c", s[i]);
            }
        }
        
        return 0;
    }
  • 相关阅读:
    常见邮件服务器(接收服务器和发送邮件服务器)地址
    Linux下搭建SVN服务器(CentOS)
    macBook下更新python
    画画练习20180627
    如何用Photoshop画一个发光金币(unity游戏素材教程)
    Python+VSCode+Git 学习总结
    如何在MFC DLL中向C#类发送消息
    MFC信号量使用指南
    回归cnBlogs
    Web自动化测试框架Watir(基于Ruby)
  • 原文地址:https://www.cnblogs.com/lucky-light/p/13021694.html
Copyright © 2011-2022 走看看