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\n", 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:\n");
    //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<<"\n"<<s[i]<<s[i+1]<<endl;
                int j = lookthrough(i); 
                s.insert(j, "}");   ///lookthrough 是寻找这个没有括号{} 的终点
                i--;        ///抵消 i++
            }
        }
    }
    //printf("补全括号后的");
    //printf("S2:\n");
    //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\n", st, ed);
    ///int main
    for(int i = 0; i <= ed; i++){
        printf("%c", s[i]);
    }
    printf("\n");
    
    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("}\n");  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(";\n");    i++;    skip(i);    i--;  
        }else if(s[i] == '{'){
            cnt++;
            newline = true; printf("{\n");  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\n", 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:\n");
    //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<<"\n"<<s[i]<<s[i+1]<<endl;
                int j = lookthrough(i); 
                s.insert(j, "}");   ///lookthrough 是寻找这个没有括号{} 的终点
                i--;        ///抵消 i++
            }
        }
    }
    //printf("补全括号后的");
    //printf("S2:\n");
    //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\n", st, ed);
    ///int main
    for(int i = 0; i <= ed; i++){
        printf("%c", s[i]);
    }
    printf("\n");
    
    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("}\n");  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(";\n");    i++;    skip(i);    i--;  
        }else if(s[i] == '{'){
            cnt++;
            newline = true; printf("{\n");  i++;    skip(i);    i--;    
        }else if(s[i] == '('){
            i++;    print2(i);  i--;
        }else{
            printf("%c", s[i]);
        }
    }
    
    return 0;
}

 

posted @ 2020-05-31 21:33  lucky_light  阅读(425)  评论(0编辑  收藏  举报