专栏文章
学了3年信竞才知道的10个挑错小技巧
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miogzuh0
- 此快照首次捕获于
- 2025/12/02 19:03 3 个月前
- 此快照最后确认于
- 2025/12/02 19:03 3 个月前
我们在平时写代码时总会遇到一些奇怪的问题需要挑错,这时一些挑错的技巧就很重要了。今天 CEXE 为大家带来了 个挑错方面的小技巧,希望能帮到大家!
打断点
打断点在遇到奇怪的 RE 时有奇效!顾名思义,我们不知道哪里出现了 RE 时,可以在运行了一部分代码后输出什么,如果输出了这个东西,就说明前面没有 RE,RE 的部分在后面。类似于二分,用不了多长时间就能找到 RE 的位置。
至于输出什么,还有一些小技巧。我为了打断点方便,宏定义了这一串内容:
CPP#define DEBUG cerr<<"---DEBUG---\n"<<__LINE__<<"\n-----------\n"
可以看到,开头和结尾都输出了一串醒目的横线,而中间输出了
__LINE__ 这坨奇怪的东西。何意味?这个东西其实是一个变量,其值是这一串所在的行数。举个简单的例子。如果我在第 行调用
CPPDEBUG;
这一行代码,会输出
CPP---DEBUG---
50
-----------
这一长串。这样就不会找不到删调试信息了。
控制变量法
我们在写一些很相似的函数时,总是出现这种情况。
CPPvoid dfs(int x,int from){
//...
for(int to:G[x]){
if(to==from) continue;
//...
dfs(to,x);
//...
}
}
void dfs2(int x,int from){
//...
for(int to:G[x]){
if(to==from) continue;
//...
dfs(to,x);//心脏骤停
//...
}
}
明明应该递归调用
dfs2() 的,却手欠写错了,调不出来怎么办?很简单,我们暂时注释掉与错误的部分无关的变量、函数,再进行编译。正常来说注释掉与一个部分无关的内容,无非就是答案错误,不会编译错误;但如果注释掉上面的 dfs(),那么代码将无法编译,此时就说明调用了不该调用的内容。IDE 会贴心帮你找出错误的地方。迭代加深搜索
写 DFS 总是死循环怎么办?别怕!来学迭代加深搜索。DFS 加上迭代加深就变成了 IDDFS,可以看做 DFS 和 BFS 生的。
IDDFS 的具体思想是,DFS 时不一遍历就遍历到底,而是遍历几层就回溯,遍历其他兄弟节点;等兄弟节点全部遍历完时,再接着向下遍历。重复上面的过程几次后,便停止 IDDFS。如此一来,就不会遇到 DFS 一直走不到头的情况了。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...