正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-S 2025 第一轮真题 › 第20题

CSP-S 2025 第一轮 第20题:程序阅读第 1 题 · 第 5 小题

阅读程序·单选 · 搜索与图遍历(DFS/BFS) · 答案 D

题目

#include <algorithm>
#include <cstdio>
#include <cstring>
bool flag[27];
int n;
int p[27];
int ans = 0;
void dfs(int k) {
    if (k == n + 1) {
        ++ans;
        return;
    }
    for (int i = 1; i <= n; ++i) {
        if (flag[i]) continue;
        if (k > 1 && i == p[k - 1] + 1) continue;
        p[k] = i;
        flag[i] = true;
        dfs(k + 1);
        flag[i] = false;
    }
    return;
}
int main() {
    scanf("%d", &n);
    dfs(1);
    printf("%d\n", ans);
    return 0;
}

本小题

如果因为某些问题,导致程序运行第 25 行的 dfs 函数之前,数组 p 的初值并不全为 0,则对程序的影响是( )。

选项

  • A. 输出的答案比原答案要小
  • B. 无法确定输出的答案
  • C. 程序可能陷入死循环
  • D. 没有影响

答案

D

题解

答案选 D. 没有影响。

关键是:数组 p 中的元素在被读取之前,一定已经被赋值,初值不会参与判断。

看这句: ``cpp if (k > 1 && i == p[k - 1] + 1) continue; ``

  • 当 k == 1 时,k > 1 为假。由于 && 的短路求值,程序不会读取 p[0]。
  • 当 k > 1 时,上一层递归已经执行了 p[k - 1] = i,然后才调用当前层的 dfs(k)。因此读到的是上一层刚选定的数,与初值无关。

另外,递归返回时虽然没有恢复 p[k],但下一次递归前会先执行 p[k] = i,覆盖旧值。

所以,p 的初值是否全为 0,都不影响输出结果。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号