专栏文章

学了3年信竞才知道的10个挑错小技巧

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miogzuh0
此快照首次捕获于
2025/12/02 19:03
3 个月前
此快照最后确认于
2025/12/02 19:03
3 个月前
查看原文
我们在平时写代码时总会遇到一些奇怪的问题需要挑错,这时一些挑错的技巧就很重要了。今天 CEXE 为大家带来了 1010 个挑错方面的小技巧,希望能帮到大家!

打断点

打断点在遇到奇怪的 RE 时有奇效!顾名思义,我们不知道哪里出现了 RE 时,可以在运行了一部分代码后输出什么,如果输出了这个东西,就说明前面没有 RE,RE 的部分在后面。类似于二分,用不了多长时间就能找到 RE 的位置。
至于输出什么,还有一些小技巧。我为了打断点方便,宏定义了这一串内容:
CPP
#define DEBUG cerr<<"---DEBUG---\n"<<__LINE__<<"\n-----------\n"
可以看到,开头和结尾都输出了一串醒目的横线,而中间输出了 __LINE__ 这坨奇怪的东西。何意味?这个东西其实是一个变量,其值是这一串所在的行数。
举个简单的例子。如果我在第 5050 行调用
CPP
DEBUG;
这一行代码,会输出
CPP
---DEBUG---
50
-----------
这一长串。这样就不会找不到删调试信息了。

控制变量法

别怕,我们不是做实验。
我们在写一些很相似的函数时,总是出现这种情况。
CPP
void 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 条评论,欢迎与作者交流。

正在加载评论...