题目描述
上机练习5.1.7 围绕着山顶有10个洞,一只狐狸和一只兔子各住一个洞。狐狸总想吃掉兔子。一天兔子对狐狸说:“你想吃我有一个条件,先把洞从1~10编上号,你从10号洞出发,先到1号洞找我;第二次隔1个洞找我,第三次隔2个洞找我,以后依此类推,次数不限。若能找到我,你就可以饱餐一顿。不过在没有找到我以前不能停下来。”狐狸满口答应就开始找了,它从早到晚找了1000次洞,累得昏了过去也没有找到兔子。请问,免子躲在几号洞里?
输入
无输入。
输出
一行,按顺序输出兔子可能躲藏的洞的编号,用空格分隔,行尾不能有空格。
#include <iostream>
#include <cmath>
using
namespace
std;
// 函数声明:判断兔子是否能躲在一个特定的洞中不被狐狸找到
bool
canHideInHole(
int
rabbitHole) {
int
foxHole = 10;
// 狐狸初始位置在10号洞
for
(
int
i = 0; i < 1000; ++i) {
// 狐狸最多查找1000次
// 计算狐狸这次要找的洞,步长为i+1
int
step = i + 1;
foxHole = ((foxHole - 1 + step) % 10) + 1;
// 更新狐狸的位置
// 检查是否找到了兔子
if
(foxHole == rabbitHole) {
return
false
;
// 兔子被找到了,返回false
}
}
return
true
;
// 兔子躲过了所有的查找,返回true
}
int
main() {
bool
foundSafeHoles =
false
;
// 标记是否已经找到安全的洞
for
(
int
hole = 1; hole <= 10; ++hole) {
// 遍历所有可能的洞(1到10)
if
(canHideInHole(hole)) {
// 判断兔子是否能躲在这个洞中
if
(foundSafeHoles) {
cout <<
" "
;
// 如果之前已经找到过安全的洞,则输出空格分隔
}
cout << hole;
// 输出当前安全的洞编号
foundSafeHoles =
true
;
// 标记已经找到安全的洞
}
}
cout << endl;
// 输出换行符
return
0;
// 返回0表示程序正常结束
}