提示:
这是一篇良心博客。
在这里,你会看到所有你可能踩到的坑。
所以,作者用这个方式来掩饰自己超蒻……
踩坑路程
一眼看过去,水题一个!随手写了这么一个代码:
1 2 3 4 5 6 7 8 9 10
| #include <bits/stdc++.h> int main(){ char c; int flag = 0; while(c = getchar()&& c != '@'){ if(c == '(')flag++; else if(c == ')') flag --; } std::cout << !flag?"YES":"NO"; }
|
结果:
(艹测评机你不打脸会死啊喂)
然后,改为do-while
:
1 2 3 4 5 6 7 8 9 10 11
| #include <bits/stdc++.h> int main(){ char c; int flag = 0; do{ c = getchar(); if(c == '(')flag++; else if(c == ')') flag --; }while(c != '@'); std::cout << !flag?"YES":"NO"; }
|
再 次 吐 血
再次思考,考虑到:)(
这种匹配方式,那么加个特判:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <bits/stdc++.h> int main(){ char c; int flag = 0,i = 0; do{ c = getchar(); if(!i && c == ')'){std::cout << "NO";return 0;} if(c == '(')flag++; if(c == ')') flag --; i++; }while(c != '@'); std::cout << !flag?"YES":"NO"; }
|
再 次 吐 血
无奈下载了一个数据看了下……
艹!还有一个\n
!
再次修改代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <bits/stdc++.h> int main(){ char c; int flag = 0,i = 0; do{ c = getchar(); if(!i && c == ')'){std::cout << "NO" << '\n';return 0;} if(c == '(')flag++; if(c == ')') flag --; i++; }while(c != '@'); std::cout << (!flag?"YES":"NO") << '\n'; }
|
我…………
再次点开一个数据:
1 2
| (a*2*3+1*2+3)+(3*2)+(1*2))1*1(@ ^ ^
|
哦哦哦还有个特判!结尾’(‘的情况!
再次修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <bits/stdc++.h> int main(){ char c = ' ',before; int flag = 0,i = 0; do{ before = c; c = getchar(); if(!i && c == ')'){std::cout << "NO" << '\n';return 0;} if(c == '(')flag++; if(c == ')') flag --; if(before == '(' && c == '@'){std::cout << "NO" << '\n';return 0;} i++; }while(c != '@'); std::cout << (!flag?"YES":"NO") << '\n'; }
|
还有?!再次点开数据:
看到这个数据,我突然发现问题就在我的思路上,考虑不到)(
这个情况。
但是能不能顺着我的思路继续做呢?完 全 可 以。
考虑到如果出现)(
的话,会出现:
1 2 3
| flag = 0 c = ) flag-- -> flag = -1 ^^
|
负数!那么修改一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <bits/stdc++.h> int main(){ char c = ' ',before; int flag = 0,i = 0; do{ before = c; c = getchar(); if(!i && c == ')'){std::cout << "NO" << '\n';return 0;} if(c == '(')flag++; if(c == ')')flag--; if(flag < 0){std::cout << "NO" << '\n';return 0;} if(before == '(' && c == '@'){std::cout << "NO" << '\n';return 0;} i++; }while(c != '@'); std::cout << (!flag?"YES":"NO") << '\n'; }
|
坑的总结
- 没看到换行
(
结尾的特判没注意
)(
的情况flag
依然等于0
导致错误