社区讨论

关于 try catch 在 oi 中的应用

P3953[NOIP 2017 提高组] 逛公园参与者 8已保存回复 10

讨论操作

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

当前回复
10 条
当前快照
1 份
快照标识符
@lo12qbmt
此快照首次捕获于
2023/10/22 14:14
2 年前
此快照最后确认于
2023/11/02 13:43
2 年前
查看原帖
我以为是 c++ 语言基础,做这题的时候看到题解代码发现大家都不用,我普及一下。
这题多组数据,如果有长度为 0 的环并且在 dfs 中找到就输出 -1。
如果没有多组数据,那可以
CPP
void dfs(...) {
    ...
    puts("-1");
    exit(0);
    ...
}
遗憾的,这题有多组数据 所以可以这么写
CPP
void dfs(...) {
    ...
    puts("-1");
    throw -1;
    ...
}

int main() {
    ...
    while (T--) {
        ...
        try {
            for (int i = 0; i <= k; i++) {
                (ans += dfs(n, i)) %= p;
            }
            printf("%d\n", ans);
        } catch (int exception) {
            assert(exception == -1);
            puts("-1");
        }
    }
    ...
}
throw -1 之后,会在递归栈里一路往上找到一个符合条件的 catch 代码块,所以这些 dfs 都自动退出了,然后执行 main 里的 puts("-1");
如果不这么写,可能要让 dfs 的返回值变成 -1,然后在每次递归的时候都判断一下返回值有没有 -1,有的话继续返回 -1。
用 try catch throw 写控制流应该还是挺方便的。

回复

10 条回复,欢迎继续交流。

正在加载回复...