酷代码 AI
菜单
服务商

有 N N 面镜子,编号从 1 1 到 N N。每面镜子都有一个特殊功能:当它首次被光线照射后,会反射出一束光,将光线射向指定的另一面镜子。具体来说,对于每个 i i( 1 ⩽ i ⩽ N 1⩽i⩽N),第 i i 面镜子会将光线射向编号为 a i a i ​ 的镜子,但只有在目标镜子 a i a i ​ 还未被光线照射的情况下才会照射。 初始时,一束光照射到了编号为 X X 的镜子。此后,只有当一面镜子第一次被照射时,它才会反射光线到其指定的目标镜子。如果目标镜子已经被照射过,则该镜子不会再次接收光线,也不会再继续传光。 请你计算,最终有多少面镜子被光线照射到。 输入格式 共 N + 2 N+2 行, 第一行一个整数 N N,表示镜子的数量。 第二行一个整数 X X,表示最初被光线照射的镜子编号。 接下来的 N N 行,每行一个整数 a i a i ​ ,表示第 i i 面镜子反射光线的目标镜子编号。 输出格式 输出一个整数,表示最终被照射的镜子总数。

以下是使用 Python 实现的代码: ```python # 读取镜子的数量 N = int(input()) # 读取最初被光线照射的镜子编号 X = int(input()) # 存储每面镜子反射光线的目标镜子编号 target_mirrors = [] for _ in range(N): target_mirrors.append(int(input())) # 用于记录镜子是否被照射过 visited = [False] * (N + 1) # 初始化计数器,记录被照射的镜子数量 count = 0 # 从最初被照射的镜子开始 current_mirror = X while not visited[current_mirror]: # 标记当前镜子为已访问 visited[current_mirror] = True # 增加计数器 count += 1 # 获取当前镜子反射光线的目标镜子 next_mirror = target_mirrors[current_mirror - 1] # 如果目标镜子未被访问,则继续照射 current_mirror = next_mirror # 输出最终被照射的镜子总数 print(count) ``` 代码解释: 1. 读取输入:首先读取镜子的数量 `N` 和最初被光线照射的镜子编号 `X`,然后依次读取每面镜子反射光线的目标镜子编号,存储在 `target_mirrors` 列表中。 2. 初始化变量:使用 `visited` 列表来记录每面镜子是否被照射过,初始值都为 `False`。使用 `count` 变量来记录被照射的镜子数量。 3. 光线传播过程:从最初被照射的镜子开始,使用 `while` 循环进行光线传播。只要当前镜子未被照射过,就标记为已访问,并增加计数器。然后获取当前镜子反射光线的目标镜子,如果目标镜子未被访问,则继续照射。 4. 输出结果:最终输出被照射的镜子总数。 复杂度分析: - 时间复杂度:$O(N)$,因为每个镜子最多被访问一次。 - 空间复杂度:$O(N)$,主要用于存储 `visited` 列表。 [2025-12-27 20:52:24 | AI问答 | 470点数解答]

相关提问
发财导航,免费问AI
实用工具查看更多