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

· · 算法·理论

我们在平时写代码时总会遇到一些奇怪的问题需要挑错,这时一些挑错的技巧就很重要了。今天 CEXE 为大家带来了 10 个挑错方面的小技巧,希望能帮到大家!

打断点

打断点在遇到奇怪的 RE 时有奇效!顾名思义,我们不知道哪里出现了 RE 时,可以在运行了一部分代码后输出什么,如果输出了这个东西,就说明前面没有 RE,RE 的部分在后面。类似于二分,用不了多长时间就能找到 RE 的位置。

至于输出什么,还有一些小技巧。我为了打断点方便,宏定义了这一串内容:

#define DEBUG cerr<<"---DEBUG---\n"<<__LINE__<<"\n-----------\n"

可以看到,开头和结尾都输出了一串醒目的横线,而中间输出了 __LINE__ 这坨奇怪的东西。何意味?这个东西其实是一个变量,其值是这一串所在的行数。

举个简单的例子。如果我在第 50 行调用

DEBUG;

这一行代码,会输出

---DEBUG---
50
-----------

这一长串。这样就不会找不到删调试信息了。

控制变量法

别怕,我们不是做实验。

我们在写一些很相似的函数时,总是出现这种情况。

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 一直走不到头的情况了。