top1编程
← 返回题目
题解

狐狸与兔子

1 条题解

  • 0
    @ 2026-8-5 1:04:44

    解题思路

    狐狸从 10 号洞出发,第 1 次找的是 1 号洞;第 2 次“隔 1 个洞”,也就是往前跳过 1 个洞,即步长为 2;第 3 次“隔 2 个洞”,步长为 3;……第 t 次步长就是 t。

    所以用一个变量 pos 记住狐狸当前在哪个洞: 第 t 次搜索时,pos 加上步长 t,因为洞只有 1~10 号,超出 10 号就要绕回 1 号继续数, 用公式 pos = (pos - 1) % 10 + 1 就能实现“绕圈”。

    用一个标记数组记下狐狸找过的洞。兔子当然不能躲在被找过的洞里, 最后把 1~10 号洞里没有被标记的洞从小到大输出,就是兔子可以躲的地方。

    验证样例 n=4:狐狸找过的洞依次是 1、3、6、10,剩下 2、4、5、7、8、9,和样例输出一致。

    参考代码

    // 狐狸与兔子:狐狸从10号洞出发,第1次找1号洞,之后每次多隔1个洞
    // 标记狐狸找过的洞,剩下没找过的洞就是兔子能躲的地方
    #include <iostream>
    using namespace std;
    bool searched[11];
    int main() {
        int n;
        cin >> n;
        int pos = 1;                                      // 第1次找的洞是1号
        for (int t = 1; t <= n; t++) {
            if (t > 1) {
                pos = pos + t;                            // 第t次比上次多隔1个洞,步长为t
                pos = (pos - 1) % 10 + 1;                 // 洞只有1~10,绕圈循环
            }
            searched[pos] = true;                         // 这个洞被狐狸找过
        }
        bool first = true;
        for (int i = 1; i <= 10; i++) {
            if (!searched[i]) {                           // 没被找过就能躲
                if (!first) cout << ' ';
                cout << i;
                first = false;
            }
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    模拟 n 次搜索是 O(n),最后检查 10 个洞是常数时间,总时间复杂度 O(n)。标记数组固定 10 个格子,空间复杂度 O(1)。

    • 1