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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)